C# 为什么编译器要删除未使用的结构而不是类

C# 为什么编译器要删除未使用的结构而不是类,c#,.net,compilation,compiler-optimization,C#,.net,Compilation,Compiler Optimization,我有休闲代码 static void Main(string[] args) { var str = new DummyStruct(); var testClass = new DummyClass(); } 类或结构都没有任何实现。但是当我在使用ILSpy发布构建后查看代码时,我得到 private static void Main(string[] args) { new DummyClass(); } 所以我的问题是:为什么编译器忽略了结构的实例化而不是类的实

我有休闲代码

static void Main(string[] args)
{
    var str = new DummyStruct();
    var testClass = new DummyClass();
}
类或结构都没有任何实现。但是当我在使用ILSpy发布构建后查看代码时,我得到

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

所以我的问题是:为什么编译器忽略了结构的实例化而不是类的实例化str随后未被使用时,code>不会执行任何操作。特别是,不会调用
DummyStruct
的构造函数


var testClass=new DummyClass()testClass
随后未使用时,code>可能会执行某些操作。
DummyClass
的构造函数可能有副作用。即使它目前没有编译器所能看到的副作用,如果它位于不同的程序集中,如果使用不同版本的库,它在运行时可能会有副作用。

那么,创建结构是否没有副作用?我最初想到的是静态构造函数,但它们对结构的作用与我所看到的不同。@toby一个接受参数的
struct
构造函数可能有副作用,但C#甚至不允许您创建无参数
struct
构造函数,编译器将任何
新结构()
都视为
默认值(Struct)
。C编译器在删除死代码方面相当保守。这是jitter的工作,它知道更多关于代码实际作用的信息。但是对于结构的“默认构造函数”来说非常容易,无论是C还是CLR都不允许定义一个。必须编写“new”它本身是相当无用的,但受C#中明确赋值规则的启发。例如,在VB.NET或C++/CLI中没有必要使用它。@HansPassant这是一个非常有用的注释。但经过一点研究,我发现,只是C#不允许创建无参数构造函数,从CLR的角度来看,它是完全正确的当然可以。你有没有相反的文档?Ecma-335第二章13.2,基本原理括号。@HansPassant我读过完全相同的一段,但它描述了CLR的工作方式,它没有指定任何不能创建默认构造函数的地方,例如,C#规范对此非常具体11时13分8秒