2016-07-24 3 views
1

У меня есть код благородных предшественниковПочему компилятор удалить неиспользуемые структуры, но не классы

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

Ни класс или структура имеет любую реализацию. Но когда я смотрю на код после сборки выпуска с использованием ILSpy я

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

Так что мой вопрос: Почему компилятор игнорирует инстанцирования структуры, но не один из класса?

+0

Компилятор C# довольно консервативен в отношении удаления мертвого кода. Это работа дрожания, он знает намного больше о том, что на самом деле делает код. Но «конструктор по умолчанию» для структуры, как правило, не разрешен ни C#, ни разрешение CLR. Необходимость писать «новое» сама по себе довольно бесполезна, но вдохновлена ​​определенным правилом назначения на C#. Не обязательно в VB.NET или C++/CLI, например. –

+0

@ HansPassant Это очень информативный комментарий. но после небольшого исследования я обнаружил, что это просто C#, который не позволяет создавать a безпараметрического конструктора, он швы полностью согласуется с точкой зрения CLR. У вас есть какие-либо документы, которые показывают обратное? – 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