Programowanie w środowiskach graficznych Wykład 3 Język C# 1
Zagadnienia 1. Wprowadzenie 2. Przestrzenie nazw 3. Typy, parametry, konwersje 4. Klasy 5. Instrukcje sterujące 6. Właściwości 7. Interfejsy, operatory is i as 8. Wyjątki 9. Delegaty 10. Typy generyczne 11. Metody anonimowe 12. Typ dzielony 13. Typ nullable 2
Wprowadzenie Język zorientowany obiektowo, powstały na bazie C++ Powstał około 2000 na zlecenie Microsoftu, jako część.net Jest jednym z języków CLI (Common Language Infrastructure). CLI ma na celu łatwą wymianę i współdziałanie kodu pisanego w różnych językach (C#, Visual Basic, J#) na różne platformy. 3
CLI 4
Klasy Definicja klasy jest połączona z deklaracją nie ma osobnych plików.h/.cpp, jak w przypadku C++ Przykładowa klasa: public class HelloWorld public static void Main() System.Console.WriteLine( Hello world ); 5
Klasy modyfikatory dostępu Modyfikatory występują przed deklaracjami klas, metod, atrybutów. public brak ograniczeń private dostęp tylko z wewnątrz klasy protected dostęp z wewnątrz klasy oraz z klas dziedziczących internal dostęp z klas z tego samego pakietu protected internal = protected OR internal 6
Klasy z atrybutem sealed Jeżeli deklaracja klasy zawiera atrybut sealed, to nie jest możliwe jej dziedziczenie sealed public class MojaKlasa 7
Tworzenie obiektów Tak samo jak w Java (lub obiekty dynamiczne w C++) Button b = new Button(); 8
Klasa object Korzeń struktury dziedziczenia Wszystkie klasy dziedziczą po object Zamiana na object może być niejawna, lecz w drugą stronę wymagane jest jawne rzutowanie int i = 10; object obj = i; int j = (int) obj; 9
Konwersje między typami niejawne (dopuszczalne, gdy nie ma straty) short x = 5; int y = x; // int ma 32 bity, a short 16, wiec ok jawne (wymagane przy możliwości straty) int x = 500; short y = (short) x; // jawna konwersja wymagana 10
Przestrzenie nazw (namespace) Zapobiegają występowaniu konfliktów w nazwach klas Grupują klasy o podobnym zastosowaniu Separatorem jest. (znak kropki) System.Console.WriteLine( Hello ); 11
Przestrzenie nazw (namespace) Zapobiegają występowaniu konfliktów w nazwach klas Grupują klasy o podobnym zastosowaniu Separatorem jest. (znak kropki) System.Console.WriteLine( Hello ); namespace klasa metoda
Przestrzenie nazw (namespace) Zapobiegają występowaniu konfliktów w nazwach klas Grupują klasy o podobnym zastosowaniu Separatorem jest. (znak kropki) System.Windows.Forms.Button b = new System.Windows.Forms.Button(); 13
Przestrzenie nazw (namespace) Zapobiegają występowaniu konfliktów w nazwach klas Grupują klasy o podobnym zastosowaniu Separatorem jest. (znak kropki) System.Windows.Forms.Button b = new System.Windows.Forms.Button(); n.space n.space n.space klasa n.space n.space n.space konstruktor 14
namespace - deklarowanie namespace Nazwa namespace NazwaWewnetrzna class PrzykladowaKlasa Odwołanie z zewnątrz: Nazwa.NazwaWewnetrzna.PrzykladowaKlasa 15
Słowo kluczowe using using System; Console.WriteLine( Witamy w.net ); UWAGA! Po using nie podajemy nazwy klasy, tylko namespace using System.Console; WriteLine( Witamy.NET ); 16
System typów Wspólny system typów.net (Common Type System) dane łatwo przekazywać między różnymi językami programowania z CLI Typy definiowane przez użytkownika Typy wyliczeniowe Struktury Klasy 17
Typy proste i typy referencyjne Typy proste Typy referencyjne Pamiętają bezpośrednio dane Każdy zawiera oddzielną kopię danych Operacje na jednej zmiennej nie mają wpływu na inne zmienne Pamiętają referencję na pamiętane dane Dwie zmienne mogą wskazywać na tą samą daną Operacje na jednej zmiennej mogą mieć wpływ na inne zmienne Referencja wskaźnik o ograniczonych możliwościach 18
Typy proste wbudowane 8-bitowe: 16-bitowe: 32-bitowe: 64-bitowe: byte, char, sbyte short, ushort int, uint, float double, decimal, long, ulong CTS Common Type System (standaryzowane typy.net): int z C# odpowiada System.Int32 z CTS.NETa long z C# odpowiada System.Int64 z CTS.NETa itp. 19
Typy wyliczeniowe Definiowanie enum KolorCzerwony,Zielony,Niebieski=14; Sposób użycia Kolor k1 = Kolor.Czerwony; Korzyści: Percepcja: mamy sensowne słowa zamiast liczb Większe bezpieczeństwo: kompilator kontroluje czy używane wartości są z dozwolonego zakresu Elastyczność: możemy przypisywać etykietom liczby w dowolny sposób, konwertować liczby na etykiety i na odwrót 20
Struktury definiowanie struct Osoba public string Imie, Nazwisko; public int Wiek; sposób użycia Osoba pracownik; pracownik.imie = "Jan"; pracownik.wiek = 30; 21
Przekazywanie parametrów 1/2 Przez wartość przekazywane są typy wbudowane oraz wyliczeniowe i struktury Pozostałe typy przekazywane są przez referencję. 22
Przekazywanie parametrów (2/2) Typ podstawowy można też przekazywać przez referencję wykorzystując słówko pomocnicze ref public void Inkrementuj(ref int liczba) liczba++; W wywołaniu metody także należy użyć ref: Inkrementuj(ref liczba); 23
Dziedziczenie class rodzic virtual public void dajkasę()... class dziecko : rodzic override public void dajkasę()... NIE jest dopuszczalne dziedziczenie wielokrotne Zostało zastąpione poprzez implementację interfejsów (jak w języku Java) 24
if else Identyczna składnia, jak w C++ / Java Warunek musi być typu bool (nie może być int, jak w C++) Unikamy więc błędów typu: if (zmienna = 5) 25
switch (1/2) Nie jest dopuszczalny automatyczny przeskok do kolejnego przypadku: case 0: ZrobCos(); break; case 1: Bez break program się nie skompiluje poza sytuacją, gdy case jest pusty : case 0: case 1: ZrobCos(); 26
switch (2/2) Skok do innego przypadku musi być jawny case 0: ZrobCos(); goto case 1; case 1: Wyrażenie może być stringiem (w C++ wymagany był int) switch (nazwisko) case Kowalski : ZrobCos(); break; case Nowak : ZrobCosInnego(); break; 27
while, do-while jak w C++ while (i < 10) Console.WriteLine( Wartość 0, i); do Console.WriteLine( Wartość 0, i); while (i < 10); 28
Pętla for Zmienne zadeklarowane w pętli for sa widoczne jedynie wewnątrz pętli (tak jak w Javie; w C++ zależało to od wersji języka) for (int i=5, j=12; i<20; i++) 29
foreach foreach (string nazwa in wszystkienazwy) Console.WriteLine(nazwa); wszystkienazwy musi realizować interfejs IEnumerable, np. kolekcje, 30
Zmienna liczba parametrów metody params pozwala tworzyć metody ze zmienną liczbą argumentów, iterujemy po tym za pomocą foreach public int Sumuj(params int[] skladniki) int suma = 0; foreach (int skladnik in skladniki) suma += skladnik; return suma; Sumuj (1, 2, 3, 4); // 10 Sumuj (5, 6); // 11 Sumuj (); // 0 31
Settery i gettery w C# to słowa kluczowe class Test Użycie: Test pom=new Test(); private int liczba; pom.liczba=1; // wywoła się set public int Liczba int x =pom.liczba; // wywoła się get get return liczba; set liczba = value; // value to alias do podstawianej wartości if (liczba < 0) liczba = 0; // minimalna sensowna liczba to 0! CELE: wykrywanie błędnych wartości, prosta aktualizacja innych zmiennych. Zmienną liczba można też używać bezpośrednio (raczej niewskazane). 32
Implementacja interfejsów interface ITestable bool TestMe(); public class MojaKlasa : ITestable bool TestMe() 33
Operator is is służy do sprawdzenia, czy obiekt można rzutować na wybrany typ bez rzucania wyjątków object o = new MojaKlasa(); if (o is MojaKlasa) ((MojaKlasa)o).Zagraj(); //rzutujemy i używamy Możemy też sprawdzać, czy obiekt implementuje wybrany interfejs: if (obiekt is ITestable) 34
Operator as Łączy is z rzutowaniem. Jeśli typ się nie zgadza, zwraca null. protected void clicked(object sender, EventArgs e) Button b = sender as Button; if (b!= null) Console.WriteLine( Naciśnięto przycisk + b.text); 35
Kolekcje ArrayList Queue Stack Dictionary Hashtable tablica kolejka stos struktura słownikowa (łączy klucz-wartość) tablica haszująca 36
37
38
39