Почему я не могу определить конструктор по умолчанию для структуры в .NET?C#

Место общения программистов C#
Ответить
Anonymous
 Почему я не могу определить конструктор по умолчанию для структуры в .NET?

Сообщение Anonymous »

В .NET тип значения (структура C#) не может иметь конструктор без параметров. Согласно этому сообщению, это предусмотрено спецификацией CLI. Происходит следующее: для каждого типа значения создается конструктор по умолчанию (компилятором?), который инициализирует все члены нулевым значением (или нулевым значением).

Почему запрещено определять такой конструктор по умолчанию?

Одно из тривиальных применений — рациональные числа:

Код: Выделить всё

public struct Rational {
private long numerator;
private long denominator;

public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }

public Rational(long num)
{
numerator = num;
denominator = 1;
}

public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
При использовании текущей версии C# значение Rational по умолчанию равно 0/0, что не так уж и круто.

PS: помогут ли параметры по умолчанию решить эту проблему для C# 4.0 или будет вызван конструктор по умолчанию, определенный CLR?



Джон Скит ответил:


Используя ваш пример, что бы вы хотели, чтобы произошло, если бы кто-то сделал:

Код: Выделить всё

 Rational[] fractions = new Rational[1000];
Должен ли он запускаться через ваш конструктор 1000 раз?


Конечно, должен , поэтому я в первую очередь написал конструктор по умолчанию. CLR должна использовать конструктор обнуления по умолчанию, если явный конструктор по умолчанию не определен; Таким образом, вы платите только за то, что используете. Тогда, если мне нужен контейнер из 1000 Rational, отличных от умолчанию (и я хочу оптимизировать 1000 конструкций), я буду использовать List, а не массив.

На мой взгляд, эта причина недостаточно веская, чтобы помешать определению конструктора по умолчанию.

Подробнее здесь: https://stackoverflow.com/questions/333 ... uct-in-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»