Сегодня я столкнулся с этой проблемой при создании struct
для хранения кучи данных. Вот пример:
public struct ExampleStruct
{
public int Value { get; private set; }
public ExampleStruct(int value = 1)
: this()
{
Value = value;
}
}
Выглядит отлично и денди. Проблема в том, что я пытаюсь использовать этот конструктор без указания значения и желая использовать значение по умолчанию 1 для параметра:
private static void Main(string[] args)
{
ExampleStruct example1 = new ExampleStruct();
Console.WriteLine(example1.Value);
}
Этот код выводит 0
и не выводит 1
. Причина в том, что все структуры имеют открытые конструкторы без параметров. Итак, как я называю this()
мой явный конструктор, в Main
то же самое происходит там, где new ExampleStruct()
на самом деле вызывает ExampleStruct()
, но не вызывает ExampleStruct(int value = 1)
. Поскольку он делает это, он использует int
значение по умолчанию 0 как Value
.
Что еще хуже, мой фактический код проверяет, что параметр int value = 1
находится в допустимом диапазоне внутри конструктора. Добавьте это в конструктор ExampleStruct(int value = 1)
выше:
if(value < 1 || value > 3)
{
throw new ArgumentException("Value is out of range");
}
Итак, поскольку он стоит прямо сейчас, конструктор по умолчанию фактически создал объект, который является недопустимым в контексте, в котором я нуждаюсь. Кто-нибудь знает, как я могу:
- A. Вызовите конструктор
ExampleStruct(int value = 1)
. - В. Измените, как значения по умолчанию заполняются для конструктора
ExampleStruct()
. - С. Некоторые другие варианты/варианты.
Кроме того, я знаю, что вместо своего свойства Value
я мог бы использовать такое поле:
public readonly int Value;
Но моя философия заключается в том, чтобы использовать поля конфиденциально, если они не являются const
или static
.
Наконец, причина, по которой я использую struct
вместо class
, состоит в том, что это просто объект для хранения неперемещаемых данных, должен быть полностью заполнен при его построении и когда передан как параметр, не должен быть null
(поскольку он передается значением как struct
), для которого предназначена структура.