poniedziałek, 12 listopada 2012

[C#|Visual Studio] Struktury

Często niedocenianym przez wielu programistów .NET typem danych są struktury. Ich stosowanie zalecane jest wszędzie, gdzie mamy do czynienia z lekkimi, często stosowanymi obiektami, jak na przykład współrzędne, figura geometryczna, pole na szachownicy itd. Korzystanie z dużych kolekcji obiektów definiowanych jako klasy powoduje o wiele większe zużycie pamięci, niż gdybyśmy zdefiniowali te obiekty jako struktury. Poniżej kilka faktów z życia struktur w świecie .NET
  • może zawierać pola, metody, konstruktory
  • nie może dziedziczyć żadnego typu (poza ValueType, z którego dziedziczą niejawnie), może implementować interfejsy
  • w MSIL dodawane jest słowo kluczowe sealed, przez co nie można ze struktur dziedziczyć
  • nie mogą zawierać jawnego bezparametrowego konstruktora
  • nie muszą być inicjowane operatore new, np.
    public struct MyStruct
    {
        public int x;
        public int y;
    }

MyStruct b;
b.x = 3;
b.y = 2;
Console.WriteLine(b.x);
Console.WriteLine(b.y);
  • pól nie można inicjalizować w ciele struktury, a jedynie w konstruktorze zawierającym parametry, lub indywidualnie można nadawać wartość każdemu polu w kodzie proceduralnym
  • aby korzystać ze struktur jako typów referencyjnych należy przeprowadzić operację boxing, aby powrócić do ValueType, należy przeprowadzić unboxing

//boxing
object o = b;
//unboxing
b = (MyStruct) o;
  • boxing zachodzi również podczas rzutowania do interfejsów, z których dziedziczy dana struktura
  • obiekty klas powstają na stercie (w pamięci wolnej), przez co sprzątane są przez Garbage Collector w sposób niederministyczny, struktury natomiast tworzone są na stosie, przez co sprzątane są zaraz po wyjściu z bloku kodu, np po wykonaniu funkcji, w której je deklarujemy
  • inicjowanie instancji struktur operatorem new nie powoduje przeniesienia ich na stertę
  • jako argumenty funkcji możemy przekazywać struktury za pomocą sowa kluczowego ref

Brak komentarzy:

Prześlij komentarz