2016-07-24 10 views
1

Ich habe die Brache CodeWarum der Compiler nicht verwendete structs entfernen, aber keine Klassen

static void Main(string[] args) 
{ 
    var str = new DummyStruct(); 
    var testClass = new DummyClass(); 
} 

Weder die Klasse oder die Struktur jede Implementierung haben. Aber wenn ich den Code nach einem Release-Build aussehen ILSpy mit erhalte ich

private static void Main(string[] args) 
{ 
    new DummyClass(); 
} 

Also meine Frage ist: Warum hat der Compiler die Instanziierung einer Struktur ignorieren, aber nicht derjenige einer Klasse?

+0

Der C# -Compiler ist ziemlich konservativ über das Entfernen von toten Code. Es ist die Aufgabe des Jitters, es weiß viel mehr darüber, was Code eigentlich macht. Aber es ist einfach für den "Standard-Konstruktor" einer Struktur, weder C# noch die CLR erlauben es, einen zu definieren. Das Schreiben von "neu" ist an sich ziemlich nutzlos, aber inspiriert von der definitiven Zuordnungsregel in C#. Nicht notwendig in VB.NET oder C++/CLI zum Beispiel. –

+0

@HansPassant Das ist ein sehr informativer Kommentar. aber nach ein wenig Forschung habe ich entdeckt, dass es nur C# ist, das die Erstellung eines parameterlosen Konstruktors nicht erlaubt, es scheint aus der Sicht der CLR völlig in Ordnung zu sein. Haben Sie zufällig eine Dokumentation, die das Gegenteil zeigt? – trebor

+0

Ecma-335 Kapitel II.13.2, rationale Klammern. –

Antwort

3

var str = new DummyStruct();, wenn str anschließend unbenutzt ist, tut nichts. Insbesondere wird kein Konstruktor von aufgerufen.

var testClass = new DummyClass();, wenn testClass anschließend nicht verwendet wird, möglicherweise etwas tun. Der Konstruktor DummyClass kann Nebenwirkungen haben. Auch wenn es momentan keine Nebenwirkungen hat, so weit der Compiler es sehen kann, wenn es sich in einer anderen Assembly befindet, kann es zur Laufzeit Nebeneffekte haben, wenn eine andere Version der Bibliothek verwendet wird.

+0

Guter Punkt für Konstrukteure. +1 –

+0

Also gibt es keine Möglichkeit für die Schaffung einer Struktur, Nebenwirkungen zu haben? Ich dachte zunächst über statische Konstruktoren nach, aber diese funktionieren für Strukturen anders als das, was ich gesehen habe. – trebor

+0

@toby Ein "struct" -Konstruktor, der Parameter akzeptiert, kann Nebeneffekte haben, aber C# lässt Sie nicht einmal einen parameterlosen 'struct'-Konstruktor erstellen, der Compiler behandelt jedes' neue Struct() 'als nur' default (Struct) ' . – hvd

Verwandte Themen