Обходя некоторые небольшие структуры, отвечая на этот пост, я неожиданно обнаружил следующее:
Следующая структура с использованием поля 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' нельзя использовать до тех пор, пока ему не будут присвоены все его поля». Я знаю, что это стандартная процедура для структуры: резервное поле для любого свойства должно быть назначено напрямую (а не через метод доступа set свойства) из конструктора структуры.
Решение - использовать явное резервное поле:
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 при первом создании.)
Это может показаться досадным ограничением при использовании автоматических свойств со структурами в C #. Подумав концептуально, мне было интересно, не будет ли это разумным местом для исключения, которое позволяет вызывать метод доступа к набору свойств в конструкторе структуры, по крайней мере, для автоматического свойства?
Это незначительная проблема, почти крайний случай, но мне было интересно, что другие думают об этом ...