В чем разница между C # и CLI, когда дело касается типов значений и конструкторов? - PullRequest
8 голосов
/ 05 августа 2010

Недавно я читал, что стандарты C # и CLI определяют различные способы обработки типов значений и конструкторов.

В соответствии со спецификацией CLI типы значений не могут иметь конструкторов без параметров, тогда как в спецификации значений C # типы значений имеютконструктор по умолчанию без параметров.Если, согласно спецификации CLI, вам нужно создать значение без указания каких-либо параметров, для этого есть специальная инструкция.

Итак, мои вопросы:

  • , почему разработчики C # намеренно отклоняются от стандарта CLI - какая польза от этого, и почему CLI не позволяет эту функциональность?
  • в моем ограниченном опыте, всякий раз, когда я обнаруживаю, что использую «специальную инструкцию» для обеспечения функциональности, которая изначально не предназначалась, это обычно немного хакерство.Чем это отличается?

Ответы [ 3 ]

7 голосов
/ 05 августа 2010

В разных местах имеет смысл с точки зрения согласованности думать о типах значений как о конструкторе без параметров. Вы всегда можете создать значение, не предоставляя никаких аргументов, и это верно как для CLI, так и для C #. В C # вы можете просто использовать стандартный синтаксис конструктора:

int x = new int();

вместо одного синтаксиса для этого и другого синтаксиса для вызова «реального» конструктора.

Обратите внимание, что в C # 2 есть оператор значения по умолчанию, который, как я полагаю, может использоваться вместо:

int x = default(int);

Это похоже на сгенерированный IL, правда. Я полагаю, что вполне возможно, что если бы у нас было это для начала, C # не «притворился», что все типы значений имеют конструкторы без параметров.

С другой стороны, рассмотрим дженерики:

public void Foo<T>() where T : new()
{
    T t = new T();
}

Должно ли это быть разрешено для типов значений? Это - это - но если C # не разрешит new int(), тогда не имеет смысла разрешать его в общей форме ...

Один интересный момент, на который вы, возможно, захотите взглянуть более подробно - хотя C # не позволит вам определить пользовательский конструктор без параметров типа значения, вы можете сделать это в IL, и C # будет иногда использовать его (и иногда нет) в зависимости от контекста. Подробнее см. в моем блоге .

0 голосов
/ 14 января 2012

Важное различие между типами значений и типами классов заключается в том, что экземпляры типов классов, в отличие от экземпляров типов значений, могут быть созданы только путем вызова конструктора и не будут представлены внешнему миру, пока конструктор не завершитили явно выставляет объект в процессе строительства.Напротив, экземпляры типа значения будут созданы путем создания включающей структуры или экземпляра типа класса с полем типа значения или путем создания массива элементов типа значения.Хотя не было технической причины, по которой Microsoft не могла бы разрешить явное конструирование без параметров для структур, было бы трудно гарантировать, что у каждой структуры будет запущен конструктор без параметров, прежде чем она будет представлена ​​внешнему миру,и было бы странно запускать такой конструктор в некоторых ситуациях, но не в других.

0 голосов
/ 05 августа 2010

, тогда как в спецификациях C # типы значений имеют конструктор по умолчанию без параметров

, который нельзя изменить.Таким образом, эффект тот же, только определяется по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...