static void BezpieczneRzutowanieDanych() //Save casting - operator 'is' i 'as'. { /* Kompilator nie sprawdza czy typy zmiennych są ze sobą zgodne lecz srodowisko uruchomieniowe (.Net). * W przypadku gdy zostanie zgłoszony wyjątek 'InvalidCastException' należy taki wyjątek przechwycic i obsłużyć, * język C# oferuje dwa przydatne operatory 'is' oraz 'as' do wykonywania operacji rzutowania. */ /* Operator 'is' * Sprawdza czy typ jest zgodny z oczekiwanym. Zwraca bool * Operator 'is' posiada 2 argumenty: z lewej strony referencje do obiektu, z prawej strony typ danych. */ Okrag okrag = new Okrag(); object ob = okrag; if (ob is Okrag) { Okrag okrag1 = (Okrag)ob; // bezpieczna operacja rzutowania (SAVE CASTING) Console.WriteLine(ob is Okrag); // wynik true; } /* Operator 'as' * Pełni taką samą role co operacja SAVE CASTING. Równiez posiada 2 arg. po lewej referencje do obiektu na stercie po prawej typ danych. * Środowisko uruchomieniowe w czasie wykonywania programu podejmie próbę rzutowania, gdy sie powiedzie zwróci wartość w przciwnym razie NULL`a. */ Okrag okrag2 = ob as Okrag; if (okrag2 != null) { // Operacja rzutowania zakonczyła sie sukcesem } /* Note: Więcej na temast 'is' oraz 'as' w rozdziale 12 (Dziedziczenie). */ }
static void KopiowanieInicjalizowanieZmiennych() { /* Kopiowanie/Inicjalizowanie zmiennych referencyjnych oraz wartościowych. */ int a; // Rezerwowana jest pamięć na stosie aby pomieścić wartość typu int (4 bajty). Okrag o; // Rezerwowana jest pamięć na stosie aby pomieścić referencje do obiektu. a = 13; // Instrukcja przypisania powoduje skopiowanie tej wartości do zaalokowanego wcześniej bloku pamięci. o = new Okrag(); // Tworzy obiekt na stercie i przypisuje referencje na stosie do zmiennej o. }
static void DefiniowanieIUzywanieKlas() { /* Klasa Okrąg. * Klasy zawierają zmienne i metody (omowione w roz. 2 i 3). Zmienne w klasie nazywane są 'polami'. */ // Więcej na temat słowa kluczowego 'new' oraz przydzielania pamięci w rozdziale 8. Okrag okrag = new Okrag(4.2f); Console.WriteLine(okrag.ObliczObwod()); }
static void KlasaSystemObject() { // Zmienna typu 'object' może przechowywać referencje do dowolnego obiektu. object obiekt; Olowek olowek = new Olowek(); obiekt = olowek; Okrag okrag = new Okrag(); obiekt = okrag; //Note: Rekomedowanie jest uzywanie aliasu 'object' zamiast System.Object tak samo jak 'string' zamiast System.String }
static void InstrukcjaSwitchTypDanych() { Okrag c = new Okrag(11); Kwadrat s = new Kwadrat(14); Trojkat t = new Trojkat(17); object o = t; if (o is Kwadrat mojKwadrat) // Zasieg zmiennej 'mojKwadrat' nie wykracza poza ifa ani case. { Console.WriteLine(mojKwadrat.DlugoscBoku); } else if (o is Okrag mojOkrag) { Console.WriteLine(mojOkrag.Promien); } switch (o) // Selectory 'case' sprawdzają typ danych obiektu o. Działanie takie same jak za pomocą powyższej instruckji if. { case Okrag circle: Console.WriteLine("o is circle {0}", circle.ToString()); break; case Kwadrat square: Console.WriteLine("o is square {0}", square.ToString()); break; case Trojkat triangle when triangle.DlugoscBoku > 1000: Console.WriteLine("Big triangle {0}", triangle.DlugoscBoku); break; case Trojkat triangle: Console.WriteLine("o is triangle"); break; } switch (o) // Selectory 'case' obsługują również wyrażenie 'when' { case Trojkat triangle when triangle.DlugoscBoku > 1000: Console.WriteLine("Big triangle {0}", triangle.DlugoscBoku); break; case Trojkat triangle when triangle.DlugoscBoku > 10: Console.WriteLine("Small triangle {0}", triangle.DlugoscBoku); break; } }
static void Main4() { Okrag o = new Okrag(); Console.WriteLine(o); Okrag o1 = new Okrag(new Punkt(1, 1), 3); Console.WriteLine(o1); Okrag o2 = new Okrag(new Punkt(-1, -1)); Console.WriteLine(o2); o2.Srodek = new Punkt(0, 0); Console.WriteLine(o2); o2.Promien = -10; //??? //Okrag o3 = new Okrag(new Punkt(0, 0), -5); // exception }
static void KorzystanieZeStosuIsterty() { Metoda(42); void Metoda(int parameter) { /* Rezerwujemy pamięć na stosie, aby pomieścić zmienną typu int. (parametr metody)*/ /* Rezerwujemu pamięć na stosice, aby pomieścić referencje. */ Okrag o; /* Rezerwujemy pamięć na stercie, aby pomieścić obiekt klasy Okrąg. Wywoływany jest konstruktor, który przekształca surowy blok pamięci w obiekt klasy Okrąg. Zapisujemy ref na stos. */ o = new Okrag(parameter); /* Po zakończeniu metody, zmienne o oraz parametr wychodzą poza zakres i pamięć przydzielona do nich utworzenia zostanie zwrócona na stos. * Środowisko uruchomieniowe odnotuje fakt, że żadna zmienna nie wskazuje na blok pamięci przechowujący obiekt 'o' i po pewnym czasie pamięć zostanie zwrócona na stertę i bedzie można użyć jej ponownie. */ } /* Note: Ilość dostępnej pamięci na stercie jest ograniczona. Gdy dojdzie do wyczerpania zostanie zgłoszony wyjątek OutOfMemoryException. */ }
static void Konstruktory() { /* Klasa Okrąg * Użycie słowa kluczowego 'new' powoduję utworzenie obiektu na podstawie szablonu klasy, aby to zrobić wymagane jest * zarezerwowanie pewnej ilości pamięci z zasobów komputera, wypełniania jej polami zdefiniowanymi przez klasę, a następnie * wywołanie konstruktora klasy, który wykona odpowiednie działanie inicjujące. */ Okrag obiektOkrąg = new Okrag(); /* Klasa Kwadrat * Istnieje możliwość zdefiniowania konstrukotra prywatnego, nie można z niego skorzystać poza klasą, co uniemożliwia * tworzenie obiektów tej klasy z poziomu metod nie bedących częścią tej klasy. */ Kwadrat obiektK = new Kwadrat(11.9f); Kwadrat klon = obiektK.KlonujKwadrat(); /* Metoda KlonujKwadrat() wywołuje w swoim ciele konstruktor prywatny. * Jeśli napiszemy własny konstruktor to kompilator nie wygeneruje już konstrukotora domyślnego. */ }
private void rysOkrag_Click(object sender, EventArgs e) { figura[kol] = new Okrag(figura[kol].X, figura[kol].Y, 100, Color.Green, this); Invalidate(); }