Kicking wokół niektórych małych struktur odpowiadając this post, natknąłem się na następujący niespodziewanie:Automatyczne właściwości i struktury nie mieszają się?
następującej strukturze, przy użyciu pola int jest doskonale prawną:
struct MyStruct
{
public MyStruct (int size)
{
this.Size = size; // <-- Legal assignment.
}
public int Size;
}
jednak następującą strukturę, stosując automatyczne właściwość nie kompiluje się:
struct MyStruct
{
public MyStruct (int size)
{
this.Size = size; // <-- Compile-Time Error!
}
public int Size{get; set;}
}
Zwrócony błąd to "Ten" obiekt nie może być użyty, zanim wszystkie jego pola zostaną przypisane do ". Wiem, że jest to standardowa procedura dla struktury: pole zaplecza dla każdej właściwości musi zostać przypisane bezpośrednio (a nie za pośrednictwem zestawu właściwości zestawu właściwości) z poziomu konstruktora struktury.
Rozwiązaniem jest użycie wyraźne pole Podłoże:
struct MyStruct
{
public MyStruct(int size)
{
_size = size;
}
private int _size;
public int Size
{
get { return _size; }
set { _size = value; }
}
}
(Zauważ, że VB.NET nie miałby tego problemu, ponieważ w VB.NET wszystkie pola są automatycznie inicjowane 0/null/false gdy po raz pierwszy utworzony.)
To byłoby niefortunne ograniczenie podczas korzystania z właściwości automatycznych z structs w C#. Myśląc koncepcyjnie, zastanawiałem się, czy nie byłoby to rozsądne miejsce na wyjątek, który pozwala wywołać właściwość set accessor w ramach konstruktora struktury, przynajmniej dla właściwości automatycznej?
Jest to niewielki problem, prawie krawędzi przypadek, ale zastanawiałem się, co inni myśleli o tym ...
Pola w języku C# są również inicjowane na wartość 0/null/false. Pamiętaj, że działa to w środowisku wykonawczym, a nie w określonym języku. ;) –
Nie dla pól konstrukcji w C#. W przypadku struct, pola muszą być inicjowane przez jawny konstruktor lub przez wywołującego, jeśli używa się niejawnego konstruktora bez parametrów. VB.NET nie ma tego ograniczenia i dlatego powyższy przykład, który nie będzie kompilowany w C#, będzie kompilował i działał poprawnie w VB.NET. –
możliwy duplikat [Dlaczego konieczne jest wywołanie: this() na struct, aby użyć właściwości automatycznych w języku C#? (Http://stackoverflow.com/questions/272153/why-is-it-necessary-to-call -to-na-strukturze-używać-automatycznych-w-c) – nawfal