StatycznaCzęść NR.2

Przykładem klasy statycznej jest np. klasa Math , która zawiera wszystkie potrzebne funkcje matematyczne jak np. cosinus. Do ich użycia klasa nie musi być zadeklarowana o czym więcej w tym wpisie.

Klasa statyczna Math
Na pewno zauważysz ,że nie wszystkie metody należą do instancji klasy; są to metody, które wykonują swoje cele w sposób niezależny od specyfikacji zainicjalizowanej klasy. To są metody statyczne. Po co one są?

Oto przykład klasy z niestatyczną metodą Dodawanie.’'

class Arytmetyka 
{
    public int Dodawanie(int a, int b)
    {
        return a + b;
    }
}  

Aby użyć tej metody muszę stworzyć obiekt tej klasy ,ale po co mam tworzyć taki obiekt, jeśli ta metoda nie potrzebuje żadnych dodatkowych zmiennych. W sumie ciało klasy dla tej metody nie miałoby tutaj żadnego użytku.

Arytmetyka art = new Arytmetyka();
int wynik = art.Dodawanie(1, 2);

Aby zadeklarować ,że dana zmienna bądź metoda jest statyczna musimy dopisać słowo kluczowe static po modyfikatorze dostępu ,ale przed określeniem typu.

class Arytmetyka 
{
    public static int Dodawanie(int a, int b)
    {
        return a + b;
    }
}  

Teraz możesz mieć dostęp do tej metody poprzez odwołanie się do samej nazwy klasy. Jak to widać w kodzie.

int wynik = Arytmetyka.Dodawanie(1, 10);

Kiedy definiujesz statyczną metodę nie może ona korzystać z żadnych pól zdefiniowanych w klasie. Chyba że pola te są też statyczne. Czyli statyczne metody mogą odwoływać się tylko do innych statycznych metod i pól. Niestatyczne pola i metody wymagają utworzenia obiektu, do których będą one odwoływane.

Tworzenie Współdzielonych pól

Kolejna ważna sprawa, pola statyczne są współdzielone przez wszystkie obiekty stworzone w tej właśnie klasie. Innymi słowy, pola statyczne są lokalne dla wszystkich instancji obiektu.

Pole statyczne NumCuboid określa ile instancji klasy Cuboid zostało utworzonych. NumCuboid jest zwiększana co jeden w każdym konstruktorze.

Do kodu dodałem też metodę statyczną ShowNumCuboid(), która nie ma problemów z wyświetleniem pola statycznego NumCuboid.

class Cuboid 
{
    public static int NumCuboid = 0;
    public static string ShowNumCuboid()
    {
        return "Number of Cuboids: " + NumCuboid.ToString();
    }

    public Cuboid()
    { a = 0; b = 0; h = 0; NumCuboid++; }

    public Cuboid(int inta, int intb, int inth)
    { a = inta; b = intb; h = inth; NumCuboid++; }

    private int a; private int b; private int h;
    public int Volume()
    {
        return a * b * h;
    }
}

Wszystkie Cuboid dzielą pole NumCuboid więc poprzez inkrementacje ta sama dana jest ciągle zmieniana. Dzięki temu metody niestatyczne też mają dostęp do pól statycznych.

Nie ma też żadnego problemu z wywołaniem pola statycznego tej klasy czy też metody statycznej.

Console.WriteLine(Cuboid.ShowNumCuboid());
Console.WriteLine(Cuboid.NumCuboid);

Słowo kluczowe const

Używając słowa constteż deklarujesz pole statyczne tyle ,że wartość tego pola nigdy nie ulegnie zmianie. Const to skrót od constant co po angielsku znaczy stała.

Const nie używa słowa kluczowego static ,ale nie zmienia to faktu ,że jest ona statyczna.

Stałymi mogą być tylko typy: byte, char, short, int, long, float, double, decimal, bool, string oraz typ wyliczeniowy, oraz typy referencyjne.

Wbrew pozorom są one powszechnie stosowane. Dla klasy Math mamy do dyspozycji stałe potrzebne do obliczeń matematycznych jak: e,pi

Stała w klasie Math e

Utworzenie stałej w swojej własnej klasie wygląda tak.

static class Arytmetyka 
{
    public const double PI = 3.14;
}  

Klasy statyczne

Kolejna ważna cecha języka C# i nie tylko to fakt ,że możemy zadeklarować klasę statyczną. Mówimy w ten sposób kompilatorowi albo innemu programiście, który przeglądałby kod ,że ta klasa nie została napisana do tworzenia swoich obiektów. Zresztą, nawet gdybyśmy chcieli utworzyć instancje klasy statycznej kompilator zgłosił błąd.

W klasie statycznej mogą znajdować się tylko pola statyczne. Aby stworzyć klasę statyczną wystarczy dopisać słowo static przed słowem class.

static class Arytmetyka 
{
    public static int Odejmowanie(int a, int b) { return a - b; }
    public static int Mnożenie(int a, int b) { return a * b; }
    public static int Dodawanie(int a, int b) { return a + b; }
} 

W klasie statycznej może znajdować się konstruktor pod warunkiem ,że on też będzie statyczny.

Statyczny konstruktor

Jeśli w klasie znajduje się statyczny konstruktor ,zostanie on wywołany przed utworzeniem jakiegokolwiek egzemplarza klasy.

Nie można dokładnie określić momentu wywołania konstruktora statycznego ,ale wiadomo ,że ma to miejsce po uruchomieniu programu ,ale przed utworzeniem egzemplarza tej klasy.

class Osoba 
{
    static Osoba()
    {
        Name = "Stefan";
    }
    private static string Name;
}
Konstruktor statyczny nie ma żadnego modyfikatora dostępu i nie może mieć. Statyczny konstruktor może operować tylko na statycznych polach.

Ten przykład jest banalny ,ale istnieją inne operacje, które muszą być wykonane chociaż raz i nie jest to operacja przypisania wartości do zmiennej.

Klasy anonimowe

Klasa anonimowa jest to klasa, która nie posiada własnej nazwy (albo przynajmniej kompilator ci tego nie powie, bo jednak jakąś nazwę klasa musi mieć ). Jest ona przydatna przy wyrażeniach, zapytaniach i typach zwracanych przez LINQ.

Możesz utworzyć anonimowy obiekt poprzez słowo kluczowe new oraz dwa nawiasy klamrowe, w których możesz napisać jakiekolwiek pola i wartości do nich.

var AnonimowyObiekt = new { Name = "Zdzisław", age = "23" };

Ponieważ nie wiesz, do jakiej klasy jest przypisany ten obiekt musi tutaj być użyte słowo kluczowe var.

Zmienna lokalna var może przechowywać jakąkolwiek wartość i jest bardzo pomocna nie tylko w takich przypadkach. Kompilator dzięki słowu kluczowemu var tworzy automatyczne zmienną tego samego typu, z jakim się inicjalizuje. Jedyną wadą takiej zmiennej jest fakt ,że nie może ona wyjść poza dany blok kodu, w którym została utworzona. Kompilator wie, jaka to klasa więc nie ma problemu z przypisaniem jej do zmiennej lokalnej var.

Klasa-Anonimowa_thumb2

Do wszystkich pól można mieć dostęp poprzez notacje kropkową.

Co się jednak stanie, jeśli zadeklaruje kolejny obiekt z klasą anonimową, z tymi samymi polami w takiej samej kolejności. W teorii kompilator powinien rozpoznać ,że są to takie same klasy anonimowe i rzeczywiście tak jest.

Klasy Anonimowe przypisanie

Czerwony tekst podkreśla ,że “AnonimowyObiekt” zmienił swoją referencję po przypisaniu jej do “AnonimowyObiekt2”.

Klasy anonimowe mogą posiadać tylko pola publiczne .Wszystkie te pola muszą być zainicjalizowane . Żadne pola nie mogą być statyczne. Nie mogą zawierać metod.

Koniec informacji o klasach

Jeśli chcesz być dobrym programistą to wiedz ,że wiadomości z następnego wpisu o tytule “Typ referencyjny i typ wartościowy” na pewno przybliży cię do tego celu.