2016-07-24 1 views
1

未使用の構造体を削除しませんが、私は休閑コードを持ってなぜコンパイラがクラス

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

クラスまたは構造体のいずれも任意の実装を持っています。私は

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

を取得ILSpyを使用して、リリースビルドの後にコードを見たときにでも、だから私の質問は:なぜコンパイラは、クラスの1構造体のインスタンス化を無視するのではなく?

+0

C#コンパイラは、デッドコードを削除することについてかなり控えめです。ジッターの仕事ですが、コードが実際に何をするかについてはもっと知っています。しかし、構造体の "デフォルトのコンストラクタ"にとっては簡単ではありません.C#やCLRではどちらも定義できません。 「新しい」と書くことは、それ自体かなり無駄ですが、C#の明確な割り当て規則に触発されています。たとえば、VB.NETやC++/CLIでは必要ありません。 –

+0

@HansPassantこれは非常に有益なコメントです。ちょっとした研究の後、パラメータのないコンストラクタの作成を許可しないのはC#だということがわかりましたが、CLRの観点からは完全にOKです。あなたは何らかの機会に、その反対を示す文書を持っていますか? – trebor

+0

Ecma-335章II.13.2、根拠括弧。 –

答えて

3

var str = new DummyStruct();、その後strが使用されていない場合、何もしません。特に、DummyStructのコンストラクタは呼び出されません。

var testClass = new DummyClass();testClassがその後使用されない場合、潜在的に何かが発生します。 DummyClassのコンストラクタには副作用があります。コンパイラが見ることができる限り、現在のところ副作用がないとしても、異なるアセンブリに存在する場合、異なるバージョンのライブラリを使用すると、実行時に副作用が生じる可能性があります。

+0

コンストラクタには良い点があります。 +1 –

+0

構造体を作成するための副作用がない方法はありますか?私は当初静的コンストラクタについて考えましたが、それらは構造体とは私が見たものとは異なった働きをします。 – trebor

+0

@tobyパラメータを取る 'struct'コンストラクタは副作用を持つかもしれませんが、C#ではパラメータのない' struct'コンストラクタを作成することさえせず、 'new(Struct)'を 'default(Struct)'として扱います。 。 – hvd

関連する問題