Как я могу установить значение авто полей поддержки свойства в конструкторе структуры? - PullRequest
19 голосов
/ 07 февраля 2009

Учитывая такую ​​структуру:

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' нельзя использовать, пока все его поля не присвоены .

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

Ответы [ 2 ]

45 голосов
/ 07 февраля 2009

До C # 6 вам нужно использовать конструктор "this" в этом сценарии:

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

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


Редактировать: до C # 6, когда это стало законным; тем не менее, в наши дни это будет намного лучше, чем readonly struct:

public readonly struct SomeStruct
{
    public SomeStruct(string stringProperty, int intProperty)
    {
        this.StringProperty = stringProperty;
        this.IntProperty = intProperty;
    }

    public string StringProperty { get; }
    public int IntProperty { get; }
}
0 голосов
/ 13 января 2013

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

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

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

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

myFoo.f2 = someValue;

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

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

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

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