Подтвердить что ты не робот

Как установить значение полей свойств автосохранения в конструкторе структуры?

Для такой структуры:

public struct SomeStruct
{
    public SomeStruct(String stringProperty, Int32 intProperty)
    {
        this.StringProperty = stringProperty;
        this.IntProperty = intProperty;
    }

    public String StringProperty { get; set; }
    public Int32 IntProperty { get; set; }
}

Конечно, генерируется ошибка компилятора, которая читает Объект 'this' не может использоваться до того, как все его поля будут присвоены.

Есть ли способ присвоить значения полям поддержки или самим свойствам, или мне нужно реализовать свойства старомодным способом с помощью собственных явных полей поддержки?

4b9b3361

Ответ 1

Вам нужно использовать конструктор "this":

public SomeStruct(String stringProperty, Int32 intProperty) : this()
{
    this.StringProperty = stringProperty;
    this.IntProperty = intProperty;
}

Выполнение этого вызывает конструктор по умолчанию, и тем самым он инициализирует все поля, что позволяет ссылаться на this в пользовательском конструкторе.

Ответ 2

Если структура будет иметь, и ее пользователи ожидают ее наличия, все три из следующих характеристик:

  • Все его состояние инкапсулировано в некоторый определенный фиксированный набор читаемых членов
  • Может быть легко создан экземпляр, в котором эти члены имеют любую комбинацию значений, которые действительны для их соответствующих типов.
  • Экземпляр по умолчанию этого типа должен иметь все эти члены, установленные для значений по умолчанию для их соответствующих типов.

тип должен раскрывать свои члены как поля. Вышеуказанные требования означают, что структура не сможет сделать ничего, что не может сделать структура открытого поля, а также будет означать, что если код не ударит о каких-либо проблемах с потоками, структура будет способна делать что-либо открытое поле struct может делать, хотя, возможно, более медленно и с более опасными потоками.

Если struct Foo имеет поля f1 и f2 и конструктор, который устанавливает эти поля в этом порядке, а если fooExpr - это какое-то выражение типа Foo [возможно, переменная, поле, ссылка на массив, свойство или что-то еще] утверждение:

myFoo.f2 = someValue;

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

myFoo = new Foo(myFoo.f1, someValue);

и при всех обстоятельствах, когда допускается первая форма, а поведение второй формы определяет семантику, они будут вести себя одинаково. Таким образом, попытка "инкапсулировать" свойства Foo не выполняет ничего, кроме того, что сделать код более громоздким для записи, менее ясным и медленным для выполнения.