Programy pisane w C# składają się z definicji klas oraz tworzonych na ich podstawie obiektów (czasami używa się struktur – „uproszczonych klas”). Klasa definiuje nowy typ, a obiekty to egzemplarze tego typu. Klasę można porównać do matrycy, a obiekty do odlewów stworzonych na podstawie tej matrycy. Przyjrzyjmy się przykładowemu programowi oraz wynikowi jego wykonania.
class
HelloWorld
{
static
void Main()
{
System.Console.WriteLine("Hello
world !");
System.Console.ReadLine();
}
}
Po skompilowaniu i uruchomieniu programu otrzymujemy napis „Hello world !”. Jak łatwo się domyśleć, za wypisywanie tekstu odpowiedzialna jest metoda
System.Console.WriteLine("Hello
world !");
„System” to przestrzeń nazw, którą możemy porównać do pewnego zbioru matryc, czyli klas (będzie o tym mowa w następnych artykułach). „Console” to klasa, w której znajduje się definicja metody „WriteLine” (także wiele innych metod), a „WriteLine” to metoda jaką należy wykonać aby wydrukować na ekranie jakiś tekst. Tekst traktujemy jako daną, a metodę „WriteLine” jako instrukcję. Teksty, zwane łańcuchami znakowymi, umieszczamy w cudzysłowach aby kompilator potrafił je odróżnić.
Na razie nie przejmujmy się przestrzeniami nazw - wystarczy, że będziemy traktować je jako pewnego rodzaju zbiór zdefiniowanych klas. Gdyby wszystkie klasy (a jest ich w .NET tysiące) znajdowały się w jednym miejscu, nikt nie potrafiłby znaleźć mu potrzebnej, tak więc pogrupowano klasy w przestrzenie nazw. „Console” to gotowa klasa stworzona dla nas przez Microsoft i umieszczona w przestrzeni „System”. Klasy, które będziemy tworzyć możemy umieszczać we własnych przestrzeniach. Przestrzenie, klasy, zmienne i metody tworzą w pewien sposób hierarchię: przestrzenie zawierają klasy, te natomiast zmienne i metody. Poruszając się po tej hierarchii stosujemy kropki. To one, tak jak gałęzie w drzewach, łączą klasę z jej zmienną lub metodą.
@STRONA@WriteLine a Write
Istnieje także metoda „Write”, różniąca się od „WriteLine” tym, że po wypisaniu tekstu kursor nie przechodzi do nowej linii.
Łatwo sprawdzić różnicę wykonując poniższy program.
class
HelloWorld
{
static
void Main()
{
System.Console.WriteLine("Pierwszy
napis wypisany przez metodę WriteLine");
System.Console.WriteLine("Drugi
napis wypisany przez metodę WriteLine");
System.Console.Write("Pierwszy
napis wypisany przez metodę Write");
System.Console.Write("Drugi
napis wypisany przez metodę Write");
System.Console.ReadLine();
}
}
Wynik jaki powinniśmy otrzymać.
W każdym z powyższych programów wykonuję także metodę
System.Console.ReadLine();
Jest to w pewnym sensie metoda odwrotna do „WriteLine”, nie wypisuje tekstu, lecz czeka na tekst, który powinniśmy jej dostarczyć. Łatwo możemy to sprawdzić uruchamiając nasz program znowu. Dopóki nie naciśniemy klawisza Enter, możemy pisać po ekranie. Naciśnięcie klawisza Enter kończy działanie metody „ReadLine”.
Nasz program składa się z jednej klasy „HelloWorld”. Wszystko znajdujące się pomiędzy klamrami „{ }” to ciało klasy. Na ciało naszej klasy składa się tylko jedna metoda „Main”. Jest to bardzo ważna funkcja w C#, ponieważ wykonanie wszystkich programów rozpoczyna się od tej metody.
Słowo kluczowe „class” określa początek definicji klasy, w tym przypadku „HelloWorld”.
Co znaczą słowa „static” oraz „void” znajdujące się przed „Main” ?
Na razie nie przejmujmy się nimi za bardzo. Wystarczy wiedzieć, że „static” określa nam, że metoda może działać mimo, że nie tworzymy obiektów klasy „HelloWorld” (mamy tylko jej definicję). „Void” natomiast określa, że „Main” nie zwraca nam żadnego wyniku (gdyby to była metoda dodająca dwie liczby to zwracałaby nam sumę).
No dobrze, mamy klasę, a gdzie są obiekty?
Klasa „HelloWorld” to klasa główna programu, ponieważ zawiera metodę „Main”, czyli jest jakby punktem startu naszej aplikacji. Nie tworzymy obiektów tej klasy, po prostu wykonanie programu rozpoczyna się od pierwszej instrukcji wewnątrz metody „Main”. Pora więc na bardziej rozbudowany przykład.
@STRONA@Instancje klas – obiekty
Tym razem stworzymy sobie dwie klasy, jedną podobną do „HelloWorld”, czyli główną klasę naszego programu oraz drugą, z której będziemy tworzyć obiekty wewnątrz klasy głównej.
class
Echo
{
string napis;
public void WczytajNapis()
{
System.Console.WriteLine("Podaj napis.");
napis = System.Console.ReadLine();
}
public
void Napisz()
{
System.Console.Write("Napisałeś: ");
System.Console.WriteLine(napis);
}
}
class KlasaGlowna
{
static
void Main()
{
Echo
obiektEcho = new Echo();
obiektEcho.WczytajNapis();
obiektEcho.Napisz();
System.Console.ReadLine();
}
}
Jak nazwa wskazuje klasą główna jest „KlasaGlowna”. Zawiera ona znaną już nam metodę „Main”, wewnątrz której tworzymy obiekt klasy „Echo” oraz wykonujemy jej metody.
Pojawiło się kilka nowych rzeczy. Omówmy najpierw klasę „Echo”. Na początku zawiera ona zmienną typu „string”, czyli tekstową (może przechowywać napisy). Następnie znajdują się dwie metody rozpoczynające się od słowa „public”. Wyraz ten oznacza dostępność elementów klasy dla innych klas. W tym przypadku mówi, że metody które poprzedza są publiczne, czyli mogą je wykonywać inne klasy (nie tylko klasa zawierająca definicje tych metod). Dzięki temu wewnątrz klasy „KlasaGlowna” możemy nie tylko tworzyć obiekty klasy „Echo”, ale też wykonać publiczne metody klasy „Echo”.
Następująca linijka
napis = System.Console.ReadLine();
oznacza, że program prosi nas o podanie tekstu (oczekuje tego metoda „ReadLine()”). Po naciśnięciu klawisza Enter, a więc po zakończeniu wprowadzania tekstu, to co wpisaliśmy „ląduje” wewnątrz zmiennej „napis”. Pozostała zawartość metod powinna być już dla nas jasna. Prześledźmy jeszcze wykonanie metody „Main” w głównej klasie. W pierwszej linijce tworzymy nowy obiekt klasy „Echo” i „wkładamy” go do zmiennej „obiektEcho”. Część
Echo
obiektEcho
to deklaracja zmiennej „obiektEcho”, która może przechowywać tylko obiekty klasy „Echo’. Następnie mamy znak „=”, który przypisuje wartość, którą będziemy przechowywać wewnątrz naszej zmiennej. Teraz wystarczy nam stworzyć nowy obiekt klasy „Echo”, aby mieć co załadować do zmiennej.
new
Echo();
A oto wynik działania powyższego programu.
Pojawiło się nowe dla nas słówko „new”. „New” służy do
tworzenia nowych instancji klas, a więc tworzenia obiektów na podstawie
zdefiniowanej klasy.
Więcej o tworzeniu nowych obiektów, a także o konstruktorach
oraz typach referencyjnych i prostych powiemy sobie w następnym artykule.