Почему запрещено определять такой конструктор по умолчанию?
Одно из тривиальных применений — рациональные числа:
Код: Выделить всё
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;
}
}
PS: помогут ли параметры по умолчанию решить эту проблему для C# 4.0 или будет вызван конструктор по умолчанию, определенный CLR?
Джон Скит ответил:
Используя ваш пример, что бы вы хотели, чтобы произошло, если бы кто-то сделал:
Код: Выделить всё
Rational[] fractions = new Rational[1000];
Конечно, должен , поэтому я в первую очередь написал конструктор по умолчанию. CLR должна использовать конструктор обнуления по умолчанию, если явный конструктор по умолчанию не определен; Таким образом, вы платите только за то, что используете. Тогда, если мне нужен контейнер из 1000 Rational, отличных от умолчанию (и я хочу оптимизировать 1000 конструкций), я буду использовать List, а не массив.
На мой взгляд, эта причина недостаточно веская, чтобы помешать определению конструктора по умолчанию.
Подробнее здесь: https://stackoverflow.com/questions/333 ... uct-in-net
Мобильная версия