Пример #1
0
        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). */
        }
Пример #2
0
        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.
        }
Пример #3
0
        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());
        }
Пример #4
0
        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
        }
Пример #5
0
        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;
            }
        }
Пример #6
0
        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
        }
Пример #7
0
        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. */
        }
Пример #8
0
        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.
             */
        }
Пример #9
0
 private void rysOkrag_Click(object sender, EventArgs e)
 {
     figura[kol] = new Okrag(figura[kol].X, figura[kol].Y, 100, Color.Green, this);
     Invalidate();
 }