Нажав несколько небольших структур, отвечая на этот пост, я неожиданно обнаружил следующее:
Следующая структура, использующая поле int, совершенно легальна:
struct MyStruct
{
public MyStruct ( int size )
{
this.Size = size; // <-- Legal assignment.
}
public int Size;
}
Однако следующая структура, использующая автоматическое свойство, не компилируется:
struct MyStruct
{
public MyStruct ( int size )
{
this.Size = size; // <-- Compile-Time Error!
}
public int Size{get; set;}
}
Возвращенная ошибка: "Объект 'this' не может использоваться до того, как все его поля будут присвоены". Я знаю, что это стандартная процедура для struct: поле поддержки для любого свойства должно быть назначено напрямую (а не через аксессуар набора свойств) из конструктора struct.
Решение состоит в том, чтобы использовать явное поле поддержки:
struct MyStruct
{
public MyStruct(int size)
{
_size = size;
}
private int _size;
public int Size
{
get { return _size; }
set { _size = value; }
}
}
(Обратите внимание, что VB.NET не будет иметь эту проблему, потому что в VB.NET все поля автоматически инициализируются до 0/null/false при первом создании.)
Это может показаться неудачным ограничением при использовании автоматических свойств с помощью структур на С#. Думая концептуально, мне было интересно, не будет ли это разумным местом для исключения, позволяющего вызывающему атрибуту свойства присваиваться в конструкторе структуры, по крайней мере, для автоматического свойства?
Это второстепенная проблема, почти крайность, но мне было интересно, что другие подумали об этом...