EDIT: Ich habe die Ergebnisse als blog post geschrieben.Wie erkennt der C# -Compiler COM-Typen?
Der C# -Compiler behandelt COM-Typen etwas magisch. Zum Beispiel sieht diese Aussage normal ...
Word.Application app = new Word.Application();
... bis Sie erkennen, dass Application
eine Schnittstelle ist. Konstruktor auf einer Schnittstelle aufrufen? Yooks! Dies wird tatsächlich in einen Anruf zu Type.GetTypeFromCLSID()
und anderen zu Activator.CreateInstance
übersetzt.
Zusätzlich in C# 4 können Sie nicht-ref Argumente für ref
Parameter verwenden, und der Compiler fügt nur eine lokale Variable durch Verweis übergeben, um die Ergebnisse zu verwerfen:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Ja, es gibt eine Reihe von Argumenten fehlt. Sind nicht optionale Parameter schön? :)
Ich versuche, das Compiler-Verhalten zu untersuchen, und ich bin nicht in der Lage, den ersten Teil zu fälschen. Ich kann ohne Probleme den zweiten Teil tun:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
Ich mag würde in der Lage sein zu schreiben:
Dummy dummy = new Dummy();
though. Offensichtlich wird es zur Ausführungszeit knallen, aber das ist okay. Ich experimentiere nur.
Die anderen Attribute, die vom Compiler für verknüpfte COM-PIAs (CompilerGenerated
und TypeIdentifier
) hinzugefügt wurden, scheinen nicht den Trick zu machen ... was ist die magische Soße?
Sie sind mir bei diesem Kram weit voraus (die meisten Sachen), aber nur zur Klarstellung, es klingt nach dem, wonach Sie suchen, ist die Abhängigkeitsinjektionsfunktionalität mit einer normalisierten Syntax - wäre das genau? –
Sind nicht optionale Parameter nett? IMO, Nein, sie sind nicht nett. Microsoft versucht, den Fehler in Office COM-Schnittstellen zu beheben, indem Sie Bloat zu C# hinzufügen. –
Nette Frage (+1). Ich habe das Gleiche bemerkt, wenn ich einen Konstruktor auf einer Schnittstelle anrufe. Es sieht im Code entsetzlich aus, weil es jeden Entwickler verwirren wird, der nicht mit dem vertraut ist, was vor sich geht. Ich habe mich immer gefragt, was hinter den Kulissen vor sich ging, damit es funktioniert. Sieht so aus, als würde ich dein neues Buch kaufen ;-) –