Rozdzia³ 2 Tworzenie instancji klas z konstruktorami Rozdzia³ 2 Tworzenie instancji klas z konstruktorami W tym rozdziale: Tworzenie konstruktora klasy. Tworzenie wielu konstruktorów dla jednej klasy. Inicjowanie instancji klasy za pomoc¹ konstruktora. Implementowanie metody ToString dla klasy. Tworzenie tablicy instancji klasy. U ywanie tablicy instancji klasy jako Ÿród³a danych kontrolki ListBox. Szacunkowy czas 1 godz. 30 min. W poprzednim rozdziale tworzyliœmy klasê Book, która zawiera³a w³aœciwoœci Text i Title. Do utworzenia nowej instancji klasy wystarcz¹ trzy wiersze kodu: jeden z deklaracj¹ i utworzeniem instancji klasy, jeden w celu ustawienia w³aœciwoœci Text i jeden w celu ustawienia w³aœciwoœci Title. W tym rozdziale tworzymy konstruktor klasy, który bêdzie umo liwia³ jednoczesne wykonywanie wszystkich tych trzech kroków: deklarowanie, tworzenie instancji i inicjowanie pól. Konstruktory Konstruktor to blok kodu wykonywany w wyniku uruchomienia s³owa kluczowego new (New lub new w zale noœci od jêzyka) podczas tworzenia instancji klasy. Konstruktory maj¹ nastêpuj¹ce zalety: Konstruktor mo e przyjmowaæ parametry, które umo liwiaj¹ inicjowanie pól w chwili tworzenia obiektu. Konstruktor mo e sprawdzaæ poprawnoœæ przekazywanych do niego parametrów podczas tworzenia klasy. Klasa mo e mieæ wiele konstruktorów. Ka dy mo e przyjmowaæ inny zestaw parametrów. Jeden konstruktor mo e wywo³ywaæ inne konstruktory. Przy definiowaniu konstruktorów w jêzykach Visual Basic i Visual C# stosujemy nieco ró ne sk³adnie. W jêzyku Visual Basic konstruktor bezparametrowy deklarujemy tak: Public Sub New() End Sub W Visual C# ten sam konstruktor nale y zadeklarowaæ, u ywaj¹c nazwy klasy: public Book() {
28 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym W obu przypadkach konstruktor deklaruje siê za pomoc¹ s³owa kluczowego public (Public lub public). Konstruktor jest niezbêdny do tworzenia instancji klasy za pomoc¹ s³owa kluczowego new. Konstruktor mo na tak e zadeklarowaæ za pomoc¹ s³owa kluczowego private (Private lub private). Jeœli zdefiniujesz tylko jeden konstruktor w klasie i bêdzie on prywatny, kod kliencki nie bêdzie w stanie tworzyæ adnych instancji klasy. Jeœli w danej klasie nie zostanie zdefiniowany aden konstruktor, kompilator sam wygeneruje pusty, publiczny i bezparametrowy konstruktor taki jak pokazany na powy szych listingach. W takiej sytuacji nale y w jakiœ inny sposób zagwarantowaæ polom klasy poprawne inicjowanie wartoœci (choæ jest to wbrew ca³ej filozofii konstruktorów). Inna implementacja klas ksi¹ ek W poprzednim rozdziale zaraz po zainicjowaniu klasy okreœlane by³y wartoœci w³aœciwoœci Text i Title. W tym rozdziale utworzysz dwa ró ne konstruktory do inicjowania pól klasy. Pierwszy, konstruktor domyœlny, bêdzie tworzy³ instancjê dok³adnie tak jak w rozdziale 1. Drugi konstruktor bêdzie inicjowa³ w³aœciwoœci Title i Text. Wprowadzimy jeszcze jedn¹ zmianê. Obiekty ksi¹ ek bêd¹ przechowywane w prostej tablicy, a nie w specjalnie utworzonym obiekcie Library. Tablica ta bêdzie stanowi³a Ÿród³o danych dla kontrolki ListBox. Tworzenie konstruktorów klasy Book To æwiczenie jest rozbudowaniem æwiczenia z rozdzia³u 1. Utworzymy nowy projekt, ale wykorzystamy w nim formularz i klasê Book utworzon¹ w rozdziale 1. Nastêpnie zmodyfikujemy klasê Book, dodaj¹c do niej dwa konstruktory i metodê ToString. Tworzenie projektu Aby utworzyæ ten projekt, wykonaj nastêpuj¹ce czynnoœci: 1. Utwórz nowy projekt aplikacji Windows i nadaj mu nazwê ReadMoreBooks. 2. Kliknij prawym przyciskiem myszy formularz Form1 w eksploratorze rozwi¹zañ i wybierz z menu podrêcznego polecenie Delete (usuñ). Kliknij przycisk OK, aby potwierdziæ zamiar usuniêcia. 3. Kliknij prawym przyciskiem myszy projekt ReadMoreBooks w eksploratorze rozwi¹zañ, wska Add (dodaj) i kliknij polecenie Add Existing Item (dodaj istniej¹cy element). 4. W oknie Add Existing Item przejdÿ do pliku Form1.vb lub pliku Form1.cs z rozdzia³u 1, kliknij go i naciœnij przycisk Open (otwórz). Do projektu ReadMoreBooks zostanie dodana nowa kopia formularza Form1. 5. Kliknij prawym przyciskiem myszy projekt ReadMoreBooks w eksploratorze rozwi¹zañ, wska Add (dodaj) i kliknij polecenie Add Existing Item (dodaj istniej¹cy element).
Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 29 6. W oknie Add Existing Item przejdÿ do pliku Book z rozdzia³u 1, kliknij go, a potem naciœnij przycisk Open (otwórz). Do projektu ReadMoreBooks zostanie dodana klasa Book. Konwersja tekstu z pola na w³aœciwoœæ Dziêki utworzeniu konstruktora bêdziemy mogli okreœlaæ, czy pole Text lub Title klasy Book jest puste. Aby dodatkowo rozszerzyæ przydatnoœæ tekstu, przekszta³cimy go na w³aœciwoœæ (w dalszej czêœci tej ksi¹ ki nie bêdzie wiele pól publicznych). 1. Kliknij dwukrotnie plik Book.vb lub Book.cs (w zale noœci od u ywanego jêzyka) w eksploratorze rozwi¹zañ, aby otworzyæ go w edytorze kodu. 2. Zmieñ pole Text na prywatne. Pamiêtaj, e zgodnie z konwencj¹ pola takie maj¹ prefiks m_. Private m_text As String = "" private string m_text = ""; 3. Dodaj definicjê w³aœciwoœci Text do klasy. Public Property Text()As String Get Return m_text End Get Set(ByVal Value As String) m_text = Value End Set End Property //Visual C# public string Text { get { return m_text; set { m_text = value; Formatowanie kodu C# W jêzyku C# do oddzielania instrukcji stosuje siê œrednik. Dziêki temu Visual C# oferuje wiêksz¹ kontrolê nad formatowaniem kodu ni Visual Basic. W cytowanym wy ej fragmencie kodu C# zastosowano bardziej zwart¹ postaæ definicji. Mo - na i warto to robiæ, o ile nie odbywa siê to kosztem czytelnoœci kodu. Dodawanie konstruktora bezparametrowego 1. Jeœli u ywasz Visual C#, w plikach Book.cs i Form1.cs zmieñ przestrzeñ nazw na ReadMoreBooks. Ten krok spowoduje, e wszystkie deklaracje klas znajd¹ siê w jednej przestrzeni nazw projektu. Dziêki temu deklarowanie zmiennych klasowych bêdzie prostsze. Zmieñ deklaracjê przestrzeni nazw na pocz¹tku pliku na nastêpuj¹c¹:
30 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym // Tylko Visual C# // Zmieñ w plikach Book.cs i Form1.cs namespace ReadMoreBooks 2. W Visual Basicu, jeœli trzeba, kliknij pozycjê Book (ReadMoreBooks) na liœcie Class Name (nazwa klasy). W Visual C# kliknij pozycjê ReadMoreBooks.Book na liœcie Class Name (nazwa klasy). 3. Z listy rozwijanej Method Name (nazwa metody) wybierz pozycjê New (nowa), jeœli u ywasz Visual Basica. Kliknij pozycjê Book, jeœli u ywasz Visual C#. Do klasy Book zostanie dodany nastêpuj¹cy kod: Public Sub New() End Sub public Book() { // // Do zrobienia: Dodaæ treœæ konstruktora // Twoim nastêpnym zadaniem bêdzie utworzenie konstruktora z parametrami. Jedna klasa mo e mieæ wiele konstruktorów, o ile ró ni¹ siê one list¹ parametrów. Tworzenie konstruktora parametrycznego Podczas tworzenia konstruktorów z parametrami pamiêtaj, e kod konstruktora jest wykonywany zawsze po inicjacjach pól. Mo na zatem przes³aniaæ inicjacje pól, czyli wpisywaæ do pól wartoœci inne ni inicjacyjne. 1. Po deklaracjach pól dodaj poni szy kod, który zawiera deklaracjê konstruktora z dwoma parametrami: title i text. Nie modyfikuj istniej¹cego konstruktora, który utworzy³eœ w poprzednim podrozdziale. Public Sub New(ByVal title As String,ByVal text As String) End Sub //Visual C# public Book(string title, string text){ 2. Dodaj poni szy kod do nowego konstruktora. Dziêki temu tytu³ ani tekst ksi¹ ki nie bêdzie pusty. Jeœli jest pusty, generowany jest wyj¹tek. Wyj¹tek zatrzymuje dzia³anie programu i uniemo liwia utworzenie instancji klasy. If (title <> "") And (text <> "") And _ (Not IsNothing(title)) And (Not IsNothing(text)) Then m_title = title m_text = text Else Throw New Exception("Title or text is an empty string.") End If if ((title!= "") && (text!= "") && (title!= null) && (text!= null)) {
Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 31 m_title = title; m_text = text; else { throw new System.Exception("Title or text is an empty string."); Jeœli usuniesz konstruktor bezparametrowy utworzony w poprzednim podrozdziale, kod kliencki zostanie zmuszony do korzystania z tego nowego konstruktora. Oznacza to, e nie zostan¹ utworzone adne instancje klasy, jeœli nie bêdzie znany tekst i tytu³ ksi¹ ki. Dodawanie metody ToString W rozdziale 1 u ywaliœmy ³añcucha znaków z pola Title podczas wyœwietlania pola listy w projekcie ReadBooks. W tym rozdziale instancje klasy Book bêd¹ przechowywane w tablicy, mo emy wiêc skorzystaæ z faktu, i Ÿród³em danych dla pola listy mo e byæ tablica. Jeœli zdefiniujemy metodê ToString dla klasy obiektów przeznaczonych do wyœwietlania, pole listy bêdzie mog³o za jej pomoc¹ wyœwietlaæ poszczególne elementy z tablicy. Dodaj tê metodê do klasy Book: Public Overrides Function ToString() As String Return m_title End Function public override string ToString() { return m_title; W przypadku biblioteki.net Framework nie mo na w³aœciwie nie zauwa yæ faktu, e wszystkie klasy s¹ pochodnymi klasy System.Object. S³owo kluczowe override (w Visual Basicu Overrides, a w Visual C# override) w deklaracji metody oznacza, e zamiast metody ToString zdefiniowanej w klasie System.Object powinna byæ u ywana metoda ToString z klasy Book. Metoda zdefiniowana w przestrzeni nazw System.Object powoduje tylko wypisanie nazwy klasy ReadMoreBooks.Book. To ju koniec zmian w definicji klasy Book. Obs³uga b³êdów sprawdzania poprawnoœci za pomoc¹ konstruktora Z sytuacj¹, w której parametr title lub text oka e siê ³añcuchem pustym, mo na poradziæ sobie na ró ne sposoby: Mo na wygenerowaæ wyj¹tek, jak w tym rozdziale. W takim przypadku nie dochodzi to utworzenia instancji klasy Book. Wykonywanie programu jest zatrzymywane na wierszu kodu zawieraj¹cym s³owo kluczowe new. Na sytuacjê tak¹ mo na zareagowaæ za pomoc¹ bloku Try (Try lub try), w którym da siê naprawiæ b³¹d.
32 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Mo na zast¹piæ pole ³añcuchem pustym. Jeœli napisa³eœ konstruktor wymuszaj¹cy stosowanie niepustych ³añcuchów w polach text i title, nie powinieneœ stosowaæ tej metody. Jeœli u y³eœ konstruktora jako wygodnego sposobu przypisywania wartoœci do w³aœciwoœci na etapie inicjacji klasy, zast¹pienie pola ³añcuchem pustym mo e byæ decyzj¹ rozs¹dn¹. Jeœli postanowisz zastêpowaæ pole ³añcuchem pustym, nie zapomnij uœwiadomiæ programistom, e pola text i title instancji klasy Book mog¹ zawieraæ ³añcuchy puste. U ywanie konstruktorów Teraz zast¹pisz wiele wierszy kodu jednym wywo³aniem konstruktora. Zast¹pisz tak e klasê Library tablic¹ i wykorzystasz mo liwoœæ wi¹zania danych biblioteki.net Framework, stosuj¹c tablicê jako Ÿród³o danych dla pola listy. Usuwanie kodu, który zostanie zast¹piony nowym 1. Kliknij prawym przyciskiem myszy pozycjê Form1 w eksploratorze rozwi¹zañ i wybierz z menu podrêcznego polecenie View Code (poka kod), aby otworzyæ edytor kodu. 2. Usuñ metodê showpage_click. 3. Usuñ deklaracjê pola Library z klasy Form1. Pole to zast¹pisz tablic¹ instancji klasy Book. ' Usuñ ten wiersz z projektu Visual Basica Private m_library As Library // Usuñ ten wiersz z projektu Visual C# private Library m_library; 4. Usuñ kod z procedury zdarzeñ Form1_Load. 5. Usuñ kod z metody listofbooks_selectedindexchanged. Zostanie ci tylko interfejs. Teraz dodasz kod, który odtworzy zachowanie programu znane z rozdzia³u 1. Tworzenie instancji klasy Book przy u yciu konstruktora Dodasz do metody Form1_Load kod tworz¹cy tablicê z instancjami klasy Book i wi¹ ¹cy j¹ z kontrolk¹ ListBox. 1. Utwórz instancjê klasy Book przeznaczon¹ na baœnie, u ywaj¹c konstruktora z dwoma parametrami. Dodaj nastêpuj¹cy kod do metody Form1_Load: Dim fairytales As Book = _ New Book("Fairy Tales", "Once upon a time there was a bear.") Book fairytales = new Book("Fairy Tales", "Once upon a time there was a bear.");
Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 33 Zwróæ uwagê na to, e kiedy wpiszesz s³owo new lub New, w zale noœci od u ywanego jêzyka, funkcje inteligencji Visual Studio (zwane IntelliSense) wska ¹ ci, e masz zdefiniowane dwa konstruktory, jak widaæ na za³¹czonym rysunku. Gdy do dyspozycji jest wiele konstruktorów, mówimy, e s¹ one przeci¹ one. 2. Utwórz instancjê klasy Book przeznaczon¹ na przepisy kucharskie, korzystaj¹c z konstruktora z dwoma parametrami: Dim cookies As Book = New Book("Cookies", _ "Chocolate chip cookies are the most delicious cookies.") Book cookies = new Book("Cookies", "Chocolate chip cookies are the most delicious cookies."); Tworzenie tablicy instancji klasy Book 1. Po deklaracjach klasy Book dodaj nastêpuj¹cy kod, tworz¹cy tablicê: Dim m_library() As Book = New Book() {fairytales, cookies Book[] m_library = new Book[] {fairytales, cookies; 2. Po deklaracji tablicy dodaj nastêpuj¹cy kod, który sprawi, e tablica zostanie wykorzystana jako Ÿród³o danych kontrolki ListBox: listofbooks.datasource = m_library listofbooks.datasource = m_library; Oto kompletny kod metody: Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim fairytales As Book = _ New Book("Fairy Tales", "Once upon a time there was a bear.") Dim cookies As Book = New Book("Cookies", _ "Chocolate chip cookies are the most delicious cookies.") Dim m_library() As Book = New Book() {fairytales, cookies listofbooks.datasource = m_library End Sub private void Form1_Load(object sender, System.EventArgs e) { Book fairytales = new
34 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Book("Fairy Tales", "Once upon a time there was a bear."); Book cookies = new Book("Cookies", "Chocolate chip cookies are the most delicious cookies."); Book[] m_library = new Book[] {fairytales, cookies; listofbooks.datasource = m_library; Reagowanie na wybranie elementu z listy reprezentowanej kontrolk¹ ListBox Po uruchomieniu aplikacji w kontrolce ListBox pojawi¹ siê tytu³y ksi¹ ek. Poniewa Ÿród³em danych kontrolki ListBox jest tablica instancji klasy Book, ka dy element z listy reprezentuje jedn¹ instancjê klasy Book. Teraz dodasz kod, który bêdzie pobiera³ dan¹ instancjê i wyœwietla³ wybran¹ stronê. 1. Do obs³ugi zdarzenia SelectedIndexChanged kontrolki ListBox o nazwie listofbooks dodaj nastêpuj¹cy kod: Dim thebook As Book = CType(listOfBooks.SelectedItem, Book) Book thebook = (Book)(listOfBooks.SelectedItem); Jak widzia³eœ w rozdziale 1, obiekty z kontrolki ListBox s¹ traktowane jak instancje obiektu System.Object. Metoda CType nie zmienia instancji, a jedynie jej widok w czasie wykonywania kodu. Sk³adnia C# jest trochê inna, ale ma taki sam efekt. Egzemplarz ksi¹ ki bêdzie traktowany nie jak instancja klasy System.Object, ale jak instancja klasy Book. 2. Pod instrukcj¹ CType dodaj nastêpuj¹cy kod, wyœwietlaj¹cy tekst jednej strony: titlelabel.text = thebook.title thebook.pagelength = Decimal.ToInt32(pageLength.Value) page.text = thebook.getpage(decimal.toint32(pagetodisplay.value)) titlelabel.text = thebook.title; thebook.pagelength = Decimal.ToInt32(pageLength.Value); page.text = thebook.getpage(decimal.toint32(pagetodisplay.value)); Poniewa pagelength.value jest w³aœciwoœci¹ stringow¹ kontrolki pagelength, nie mo na bezpoœrednio przypisaæ jej wartoœci do w³aœciwoœci ca³kowitoliczbowej thebook.pagelength. Dlatego potrzebna jest metoda Decimal.ToInt32, która przekszta³ci string pagelength.value na liczbê ca³kowit¹. 3. Uruchom i przetestuj program. Powinien dzia³aæ tak samo jak aplikacja z rozdzia³u 1. Te dwa æwiczenia demonstruj¹ pewne opcje dostêpne przy projektowaniu obiektów i aplikacji. W rozdziale 1 zaprojektowa³eœ klasy Book i Library, które mia³y stanowiæ model do rozwi¹zywanego zadania. W tym rozdziale zaprojektowa³eœ tylko klasê Book, a potem zaimplementowa³eœ funkcjonalnoœæ klasy Library, wykorzystuj¹c mo li-
Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 35 woœci kontrolek systemu Windows dla platformy.net. Funkcjonalnoœæ klasy Library zapewni³a kontrolka ListBox wspó³pracuj¹ca z tablic¹. Deklarowanie i inicjowanie tablic Tablice instancji klas mo na deklarowaæ i inicjowaæ na wiele sposobów. Oto sk³adnia zastosowana w poprzednim podrozdziale (Visual Basic): Dim m_library() As Book = New Book() {fairytales, cookies A to inny sposób zadeklarowania tej samej tablicy: Dim books() As Book = _ {New Book("Title1", "Text1"), New Book("Title2", "Text2") Jeszcze inny: Dim m_library() As Book = {fairytales, cookies I jeszcze inny: Dim books(2) As Book books(0) = New Book("Title1", "Text1") books(1) = New Book("Title2", "Text2") books(2) = New Book("Title3", "Text3") Typy referencyjne i wartoœciowe Aby zrozumieæ, o co chodzi w ostatnich trzech fragmentach kodu, musisz poznaæ pojêcie typu referencyjnego i typu wartoœciowego w jêzykach Visual Basic i Visual C#. Ka da zmienna deklarowana w tej ksi¹ ce bêdzie jednego b¹dÿ drugiego typu. Typy danych w Visual Basicu i C# W jêzyku Visual Basic ka da zmienna jest typu referencyjnego lub wartoœciowego. W jêzyku C# wystêpuje jeszcze trzecia kategoria: typy wskaÿnikowe. Zmiennej typu wskaÿnikowego, podobnej do wskaÿnika z C++, mo na u yæ tylko w niezabezpieczonym bloku kodu. W tej ksi¹ ce nie zajmujemy siê kodem niezabezpieczonym. Zmienn¹ typu referencyjnego tworzymy za ka dym razem, gdy deklarujemy j¹ jako: klasê (na przyk³ad Book), interfejs (interfejsy s¹ omawiane w rozdziale 9), tablicê (na przyk³ad Dim numbers() as Integer), string, obiekt (na przyk³ad Dim x As Object), delegacjê (delegacje zostan¹ omówione w rozdziale 7). Typ wartoœciowy powstaje w wyniku zadeklarowania zmiennej jako typu: ca³kowitoliczbowego (na przyk³ad Integer lub int),
36 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym zmiennopozycyjnego (na przyk³ad Double lub double), logicznego (na przyk³ad Boolean lub bool), wyliczeniowego (na przyk³ad System), strukturowego (na przyk³ad DateTime). Zarówno w przypadku deklarowania zmiennej typu wartoœciowego, jak i przy deklarowaniu zmiennej typu referencyjnego dla zmiennej rezerwowane jest pewne miejsce w pamiêci. Jednak w przypadku typu wartoœciowego w miejscu tym przechowywana jest wartoœæ zmiennej, a w przypadku zmiennej typu referencyjnego referencja do wartoœci (instancji klasy znajduj¹cej siê gdzieœ w pamiêci). Zatem deklaracje referencyjne powoduj¹ zarezerwowanie tylko takiej iloœci pamiêci, która wystarczy na odwo³anie siê do instancji klasy Book. Dim abook as Book; Book abook; Gdy instancja klasy tworzona jest za pomoc¹ operatora new (w Visual Basicu New, a w Visual C# new), rezerwowana jest pamiêæ na pola zadeklarowane w klasie. Poni - sze wyra enia powoduj¹ zarezerwowanie pamiêci na pola Text, PageLength i Title klasy Book. Operator new zwraca adres miejsc w pamiêci zawieraj¹cych wartoœci pól. New Book("theTitle", "thetext") new Book("theTitle", "thetext") Poni sze instrukcje tworz¹ instancjê klasy Book i przypisuj¹ zmiennej abook miejsce nowej instancji. abook = New Book("theTitle", "thetext") abook = new Book("theTitle", "thetext") Jaka jest zatem wartoœæ zmiennej abook w pierwszym zestawie instrukcji, zanim nast¹pi powy sze przypisanie? Z definicji wartoœci¹ typu referencyjnego przed inicjacj¹ jest Nothing w Visual Basicu oraz null w C#. Poni szy kod zwraca wartoœæ True: Dim abook as Book MessageBox.Show((aBook Is Nothing).ToString()) Book abook; MessageBox.Show((aBook == null).tostring()); Visual Basic do testowania wartoœci typów referencyjnych oferuje s³owo kluczowe Is.C# pozwala na stosowanie operatora porównania ==. Visual Basic udostêpnia te metodê IsNothing do testowania wartoœci referencji. Zwraca ona wartoœæ logiczn¹ True, jeœli referencja jest równa Nothing. Poni szy fragment kodu jest odpowiednikiem poprzedniego: Dim abook As Book MessageBox.Show(IsNothing(aBook).ToString()) Jeœli spróbujesz u ywaæ w³aœciwoœci lub metod referencji równej Nothing, zostanie wygenerowany b³¹d, a to dlatego, e nie ma jeszcze danych instancji, na których mo -
Rozdzia³ 2 Tworzenie instancji klas z konstruktorami 37 na by operowaæ. B³¹d ten jest znany jako wyj¹tek System.NullReferenceException. Aby program sta³ siê bardziej odporny, nale y sprawdzaæ, czy dana referencja nie jest równa null (w przypadku Visual Basica Nothing). Sprawdzenie takie nale y stosowaæ szczególnie w przypadku przekazywania metody jako parametru. Mamy bowiem wtedy mniejsz¹ kontrolê nad stanem zmiennej. Specyfika typów referencyjnych dotyka takich zagadnieñ, jak kopiowanie, sprawdzanie równoœci i zbieranie œmieci (odzyskiwanie pamiêci). Kopiowanie omawiane jest w rozdziale 10, sprawdzanie równoœci w rozdziale 12, a zbieranie œmieci w rozdziale 8. Deklaracje tablic W pierwszych trzech przyk³adach z podrozdzia³u Deklarowanie i inicjowanie tablic u yto ró nych odmian nastêpuj¹cej sk³adni: Dim m_library() As Book = {fairytales, cookies W tym przyk³adzie tablicê elementów otrzymujemy dziêki nawiasom klamrowym. Identyfikator fairytales mo na zast¹piæ wyra eniem New Book("Fairy Tales", "Once upon a time"), poniewa wyra enie to zwraca referencjê do instancji klasy. Ten przyk³ad jest nieco inny od pozosta³ych: Dim books(2) As Book books(0) = New Book("Title1", "Text1") books(1) = New Book("Title2", "Text2") books(2) = New Book("Title3", "Text3") Pierwsza instrukcja nie tworzy adnych instancji klasy Book. Tworzy jedynie tablicê instancji klasy Book. W wierszach od drugiego do czwartego instancje klasy Book s¹ tworzone i przypisywane do referencji. Krótkie podsumowanie Zadanie tworzenie konstruktora bez parametrów tworzenie konstruktora parametrycznego Sposób wykonania Wybierz w edytorze kodu nazwê klasy z listy Class Name (nazwa klasy) i wybierz New (w przypadku Visual Basica) lub nazwê klasy z listy (w Visual C#) z listy rozwijanej Method Name (nazwa metody). Albo Dodaj ten kod (Visual Basic): Public Sub New() End Sub Lub ten kod (Visual C#): public Book() { Utwórz konstruktor bez parametrów. Dodaj parametry tak samo jak w przypadku metody dowolnej klasy.
38 Microsoft Visual Basic.NET i Microsoft Visual C#.NET w programowaniu obiektowym Zadanie tworzenie tablicy instancji referencji tworzenie tablicy instancji sprawdzanie, czy referencja jest równa Nothing b¹dÿ null Sposób wykonania Dodaj nastêpuj¹cy kod (Visual Basic): Dim books() As Book lub kod (Visual C#): Book[] books; Dodaj nastêpuj¹cy kod (Visual Basic): Dim books() As Book = _ { New Book(), New Book() lub kod (Visual C#): Book[] books = { new Book(), new Book(); Dodaj nastêpuj¹cy kod (Visual Basic): Dim abook As Book If IsNothing(aBook) Then ' Miejsce na kod dla ' referencji pustej End If lub kod (Visual C#): Book abook; if (abook == null) { // Miejsce na kod dla // referencji pustej