730 likes | 902 Views
Platformy technologiczne Elementy języka c#. mgr inż. Tomasz Gawron. Czym jest C#. Stworzony specjalnie dla .NET Zbliżony składniowo do C++ i Javy Posiada IDE (Visual Studio) Obiektowy, obsługuje zdarzenia (event-driven) Może współpracować z komponentami stworzonymi w innych językach
E N D
Platformy technologiczneElementy języka c# mgr inż. Tomasz Gawron
Czym jest C# • Stworzony specjalnie dla .NET • Zbliżony składniowo do C++ i Javy • Posiada IDE (Visual Studio) • Obiektowy, obsługuje zdarzenia (event-driven) • Może współpracować z komponentami stworzonymi w innych językach • Język zarządzany (obsługiwany przez garbage collector) Platformy Technologiczne 2012
Struktura programu // Namespace Declaration using System; namespace MyProgram { // helper class class OutputClass { string myString; // Constructor public OutputClass(string inputString) { myString = inputString; } // Instance Method public void printString() { Console.WriteLine("{0}", myString); } } • // Program start class • classInteractiveWelcome • { // Main begins program execution. • public static void Main(string[] args) • { // Write to console/get input • Console.Write("What is your name?: "); • Console.Write("Hello, {0}! ", Console.ReadLine()); • Console.WriteLine("Welcome to the C# Tutorial!"); • // Instance of OutputClass • OutputClassoutCl = new OutputClass("This is printed by the output class."); • // Call Output class' method • outCl.printString() • } • } Platformy Technologiczne 2012
Typy zmiennych Platformy Technologiczne 2012
Typy wartościowe • Typy całkowite • (8 bit) byte (0, 28-1), sbyte (-27, 27-1) • (16 bit) short (-215, 215-1), ushort • (32 bit) int (-231, 231-1), uint • (64 bit) long (-263, 263-1), ulong • Typy zmiennoprzecinkowe • (32 bit) float (±1,5*10-45 ,±3,4*1038) float x = 0.5f; • (64 bit) double (±5,0*10-324 ,±1,7*10308) double x = 0.5; • Typy binarne • bool Platformy Technologiczne 2012
Typy wartościowe „nullowalne” • Oprócz standardowych wartości mogą przyjmować również null • Definicja ze znakiem zapytania: • Dodatkowe właściwości: • HasValue (wartość binarna sprawdzająca czy zmienna nie jest null) • Value • Operator „??” • Gdy pierwsza wartość jest null, przekaż wartość drugą int? i = null; int x = a ?? b; Platformy Technologiczne 2012
Boxing i unboxing • Wykorzystywane przy przejściach pomiędzy typami wartościowymi a referencyjnymi • Boxing: • Alokacja „pudełka” na stercie, skopiowanie wartości do „pudełka” • Unboxing: • Sprawdzenie typu „pudełka”, skopiowanie wartości z „pudełka” na stos • Korzyści: • Nie są potrzebne klasy – wrappery • Kolekcje są uniwersalne – współpracują z każdym typem Platformy Technologiczne 2012
Boxing i unboxing 123 i int i = 123; object o = i; int j = (int)o; o System.Int32 123 123 j Platformy Technologiczne 2012
Co się stanie? F a = new F(5); //konstruktor przypisuje przekazaną wartość zmiennej a F b = a; b.X= 10; Console.WriteLine(a.X); //wynik? int a = 1; int b = a; b = 2; Console.WriteLine(a); //wynik? Platformy Technologiczne 2012
Klasy • Dziedziczenie po jednej klasie • Implementacja wielu interfejsów • Modyfikatory dostępu: • Public • Private • Protected • Internal • Elementy klasy: • Stałe, pola, metody, właściwości, indeksery, zdarzenia, operatory, konstruktory, destruktory • Elementy statyczne / instancji • Typy zagnieżdżone Platformy Technologiczne 2012
Konstruktory klas • Konstruktor jest metodą wywoływaną podczas tworzenia nowej instancji klasy • Posiada taką samą nazwę jak klasa • Nie zwraca żadnych wartości • Może być przeciążony class NazwaKlasy{ public NazwaKlasy(){ //konstruktorbezargumentowy ... } public NazwaKlasy(int arg1,double arg2){ //konstruktor z argumentami ... }} Platformy Technologiczne 2012
Klasy wieloplikowe • W C# definicję klasy można podzielić pomiędzy wiele plików (np. WinForms) • Wszystkie pliki muszą być dostępne w czasie kompilacji //Plik1.cspartial class Klasa1 { //częściowadefinicjaklasy} //Plik2.cspartialclass Klasa1 { //częściowadefinicjaklasy } Platformy Technologiczne 2012
Struktury • Struktury są zawsze wartościami • Mogą zawierać pola, interfejsy, funkcje składowe i konstruktory z argumentami • Przypisanie kopiuje dane nie referencję • Brak dziedziczenia • Struktury są wydajniejsze przy lekkich obiektach (np. punkt) – nie wymagana obsługa przez GC • Wydajniejsze zużycie pamięci Platformy Technologiczne 2012
Interfejsy • Zbiór funkcji pod wspólną nazwą • Same deklaracje - brak implementacji • Wszystkie składowe publiczne • Wielokrotne dziedziczenie • Elementy: • metody, właściwości, indeksery, Zdarzenia Platformy Technologiczne 2012
Interfejsy • Klasę implementującą jeden lub wiele interfejsów można traktować jako klasę należącą do wielu typów. Może być postrzegana jak instancja typu każdego z implementowanych interfejsów • Możliwość traktowania odmiennych klas w podobny sposób, jeśli implementują ten sam interfejs interface INazwa{ void f(); String Wlasciwosc{ get; set; } event EventHandlerzdarzenie; //inti; - błąd } class Klasa : INazwa { String s; public virtual void f(){...} public virtual String Wlasciwosc { get {return s;} set {s = value;} } public virtual event EventHandlerzdarzenie; } //Słowo virtual jest opcjonalne Platformy Technologiczne 2012
Implementacja interfejsu • Jawna • Niejawna interface Interfejs1 { void f();} interface Interfejs2 { void f();} • class Klasa : Interfejs1, Interfejs2 {public void f() { Console.WriteLine("Implementacja w sposóbniejawny"); }} interface Interfejs1 { void f();} interface Interfejs2 { void f();} class Klasa : Interfejs1, Interfejs2 { • void Interfejs2.f() {Console.WriteLine("Implementacja w sposóbjawny"); } } Platformy Technologiczne 2012
Enum • Silnie typowane typy wyliczeniowe • Brak jawnej konwersji na int • Zawierające zbiór nazwanych stałych • Nie mogą być deklarowane wewnątrz metody • Można jawnie zadeklarować typ • Kod staje się czytelniejszy enum Color: byte { Red = 1, Green = 2, Blue = 4, Black = 0, White = Red | Green | Blue, } Platformy Technologiczne 2012
Kompilacja warunkowa • #define, #undef • #if, #elif, #else, #endif • Logika bool - owska • Można implementować metody warunkowe • Wykonanie zależne od trybu wywołania programu Platformy Technologiczne 2012
Tablice • Deklaracja: • Cechy tablic: • Jednorodność • Swobodny dostęp • Stała liczba elementów • Ciągłość pamięciowa int[] tab = new int[4]; float[, ,] tab2 = new float[3, 3, 3]; Platformy Technologiczne 2012
Kolekcje • System.Collections oraz System.Collections.Generic Platformy Technologiczne 2012
Porównywanie obiektów • IComparable (interfejs dla typów posiadających porządek) • IComparer (interfejs realizujący porównanie obiektów) public interfaceIComparable { intCompareTo(objectobj); // <0 if this < obj, 0 if this == obj, >0 if this > obj } public interfaceIComparable<T> { intCompareTo(T obj); // <0 if this < obj, 0 if this == obj, >0 if this > obj } public interfaceIComparer { intCompare(object x, object y); // <0 if x < y, 0 if x == y, >0 if x > y } public interfaceIComparer<T> { intCompare(T x, T y); // <0 if x < y, 0 if x == y, >0 if x > y } Platformy Technologiczne 2012
Pętle • For • Foreach • Kolekcja musi implementować interfejs IEnumerable • While • Do… while int number = 5; for(int i = 0; i < number; i++) { Console.WriteLine(i); } int number = 0; while(number < 5) {number = number + 1;} int number = 0; do {number = number + 1;} while(number < 5); ArrayList list = new ArrayList(); list.Add(„Jan Kowalski"); list.Add(„Adam Nowak"); foreach(string name in list) { Console.WriteLine(name); } Platformy Technologiczne 2012
Atrybuty • Służą dołączaniu metadanych do kodu public class OrderProcessor { [WebMethod] public void SubmitOrder(PurchaseOrder order) {...} } [XmlRoot("Order", Namespace="urn:acme.b2b-schema.v1")] public class PurchaseOrder { [XmlElement("shipTo")] public Address ShipTo; [XmlElement("billTo")] public Address BillTo; [XmlElement("comment")] public string Comment; [XmlElement("items")] public Item[] Items; [XmlAttribute("date")] public DateTimeOrderDate; } Platformy Technologiczne 2012
Atrybuty • Mogą być dołączane do klas, typów oraz metod • Dostęp uzyskujemy za pomocą refleksji • W pełni „konfigurowalne” • Klasy dziedziczące po System.Attribute • Bezpieczne (typ sprawdzany jest podczas kompilacji) • Przykłady użycia: • Web Services, XML, serializacja, konfiguracja kodu Platformy Technologiczne 2012
Delegaty • Zorientowane obiektowo wskaźniki na metody • Zastępuje wskaźniki do funkcji • Sygnatura i typ wartości zwracanej delegacji musi być identyczny jak funkcji którą reprezentuje • Pozwala wywołać dowolną metodę z dowolnego obiektu • Dwa typy: • System.Delegate • System.MulticastDelegate Platformy Technologiczne 2012
Definiowanie i używanie delegatów Deklaracja delegatu delegate void Notifier (string sender); // ordinary method signature // with the keyword delegate Deklaracja zmiennej delegatu Notifiergreetings; Przypisanie metody void SayHello(string sender) { Console.WriteLine("Hello from " + sender); } greetings= new Notifier(SayHello);// or just:greetings= SayHello; Wywołanie delegacji greetings("John");// invokes SayHello("John") => "Hello from John" Platformy Technologiczne 2012
System.MulticastDelegate • Delegat zawierający referencję do kilku metod Notifiergreetings; greetings = SayHello; greetings+=SayGoodBye; greetings("John"); // "Hello from John" // "Good bye from John" greetings-=SayHello; greetings("John"); // "Good bye from John" Platformy Technologiczne 2012
Metody anonimowe • Metoda jest tworzona dynamicznie • Ma wszystkie funkcjonalności metod „jawnych” • Przykład: • „f” jest delegatem inta = 12; f += delegate(intb) {return a * b; } Platformy Technologiczne 2012
Zdarzenia • Zdarzenia (event) w C# są specjalnym typem delegatów • Dwóch uczestników: • Źródło zdarzeń - ten który publikuje • Odbiorca – subskrybent (może być wielu subskrybentów) • Deklarowane wewnątrz klas Platformy Technologiczne 2012
Zdarzenia - źródło • Zdefiniowanie delegatu • Zdefiniowanie logiki public delegate void EventHandler(object sender, EventArgse); public class Button { public eventEventHandlerClick; protected void OnClick(EventArgs e) { // This is called when button is clicked if (Click != null) Click(this, e); } } Platformy Technologiczne 2012
Zdarzenia - subskrybent • Definicja i zarejestrowanie obsługi public class MyForm: Form { Button okButton; static void OkClicked(object sender, EventArgs e) { ShowMessage("You pressed the OK button"); } public MyForm() { okButton = new Button(...); okButton.Caption = "OK"; okButton.Click += new EventHandler(OkClicked); } } Platformy Technologiczne 2012
Przesyłanie argumentów do metod • Wartość • Referencja • Parametr wyjściowy static void Nazwa(int x){...} int a = 5;Nazwa(a); static void Nazwa(ref int x){...} int a = 5;Nazwa(ref a); static void Nazwa(out int x){...} int a;Nazwa(out a); Platformy Technologiczne 2012
Właściwości • Definicja wirtualnego atrybutu • Dostęp definiowany przez „get” oraz „set” • Korzyści: • Pojęcie reprezentuje pewien atrybut klasy, ale w celu jego implementacji trzeba wywołać pewne funkcje • Jedną wartość można w prosty sposób obliczyć na podstawie drugiej • Dostęp do pola klasy musi być kontrolowany w celu zapewnienia spójności (poprawności) obiektu • Ukrycie implementacji (typu) [modyfikatordostępu] typNazwa{ get{...} set{...}} Platformy Technologiczne 2012
Automatyczne właściwości • Wprowadzone w C# 3.0 • Uproszczenie kodowania //C# 2.0 private int age; public int Age { get { return age; } set { age = value; } } //C# 3.0 public intMyAge { get; set; } Platformy Technologiczne 2012
Indekser • Oferuje sposób dostępu do kolekcji wartości utrzymywanych w ramach pojedynczego obiektu klasy – parametry jak indeks kolekcji public class SkyScraper { Story[] stories; public Story this [int index] { get { return stories[index]; } set { if (value!=null) { stories[index] = value; } } } SkyScrapersearsTower = new SkyScraper(); searsTower[155] = new Story(“Observation Deck”); searsTower[0] = new Story(“Entrance”); Platformy Technologiczne 2012
Inicjalizatory • Pozwalają na uproszczone przypisywanie wartości do publicznych pól klasy • Można z nich korzystać przy inicjalizacji struktur public class Human { public int Age { get; set; } public int Height { get; set; } } Human h1 = new Human(); h1.Age = 24; h1.Height = 175; Human h2 = new Human() { Age = 18, Height = 168 }; Platformy Technologiczne 2012
Zmienne niejawnie typowane • Zmienna typu „var” • Kompilator zawsze generuje silnie typowaną referencję na podstawie aktualnej wartości • Ograniczenia: • Wartość musi być zainicjalizowana przy deklaracji • Nie może być zainicjalizowana jako null • Typ musi być dostępnu dla kompilatora • Nie mogą być polami klas var f = 3.0f; Platformy Technologiczne 2012
Typy anonimowe • Tworzone dynamicznie przy użyciu zmiennych niejawnych • Dobra metoda enkapsulacji właściwości tylko do odczytu • Typy są generowane dynamicznie na poziomie kompilatora • Wykorzystanie w LINQ var v = new { Price = 200, Quantity = 5 }; Platformy Technologiczne 2012
Wyrażenia lambda • Składnia: • (parametry wejściowe) => (operacje) IEnumerable<string> allJohns = allNames.Where(x => x.Equals("John")); Platformy Technologiczne 2012
Metody rozszerzające • Umożliwiają rozszerzanie istniejących klas o nowe metody • Metoda musi być zdefiniowana jako statyczna public static class Extensions { public static int Increment(this inti) { return ++i; } } //wywołanie int i = 0; int j = i.Increment(); Platformy Technologiczne 2012
Wyjątki • Wyjątek jest sytuacją, która nie może być rozwiązana w danym kontekście aplikacji (dzielenie przez 0, błąd połączenia z bazą danych) • Zgłoszenie wyjątku oznacza, że wystąpiła błędna sytuacja, której aplikacja nie potrafi sama rozwiązać • Wyjątek powinien być przechwycony w kodzie oraz odpowiednio obsłużony poprzez przekazanie sterowania do właściwego bloku • Standardowym procesem obsługi wyjątków jest zgłoszenie i zalogowanie błędu oraz zakończenie błędnego procesu Platformy Technologiczne 2012
Wyjątki • Wyjątki mogą pojawiać się na różnych poziomach abstrakcji • Sprzętu / systemu operacyjnego • Dzielenie przez 0 • Stack overflow • Języka • Niepoprawna konwersja • Null pointer exception • Błędy rzutowania • Programu • Wyjątki zdefiniowane przez użytkownika Platformy Technologiczne 2012
Typy wyjątków Platformy Technologiczne 2012
Obsługa wyjątków using System; class ExceptionTestClass { public static void Main() { int x = 0; try { int y = 100/x; } catch (ArithmeticException e) { Console.WriteLine("ArithmeticException Handler: {0}", e.ToString()); } catch (Exception e) { Console.WriteLine("Generic Exception Handler: {0}", e.ToString()); } finally { //some finalization logic } } } Platformy Technologiczne 2012
TextReader StreamReader StringReader TextWriter BinaryReader BinaryWriter StreamWriter StringWriter … System.IO - Strumienie Stream FileStream MemoryStream NetworkStream Platformy Technologiczne 2012
System.IO.Stream public abstract classStream : MarshalByRefObject, IDisposable { public abstract boolCanRead { get; } public abstract boolCanSeek { get; } public abstract boolCanWrite { get; } public abstract intRead(outbyte[] buff, int offset, int count); public abstract voidWrite(byte[] buff, int offset, int count); public virtual intReadByte(); public virtual voidWriteByte(byte value); public virtualIAsyncResultBeginRead(…); public virtualIAsyncResultBeginWrite(…); public virtual intEndRead(…); public virtual intEndWrite(…); public abstract longLength { get; } public abstract longPosition { get; set; } public abstract longSeek(long offset, SeekOrigin origin); public abstract voidFlush(); public virtual voidClose(); ... } • Bazowe właściwości strumienia • Synchroniczny odczyt i zapis • Asynchroniczny odczyt i zapis • Długość i aktualna pozycja • Pozycjonowanie • Wysłanie danych i zamknięcie strumienia Platformy Technologiczne 2012
Operacje na strukturze plików • Wszystkie klasy znajdują się w System.IO • Directory, DirectoryInfo • Operacje na katalogach • File, FileInfo • Operacje na plikach • Path • Operacje na tekście zawierającym informacje o ścieżce dostępu do pliku lub katalogu • FileSystemWatcher • Monitoring systemu plików Platformy Technologiczne 2012
System.String • Obsługa znaków specjalnych w ciągach (zastosowanie „@”) string rst1 = "Hi there!"; string vst1 = @"Hi there!"; string rst2 = "It started, \"Four score and seven...\""; string vst2 = @"It started, ""Four score and seven..."""; string rst3 = "Value 1 \t 5, Val2 \t 10"; // Interprets tab esc sequence string vst3 = @"Value 1 \t 5, Val2 \t 10"; // Does not interpret tab string rst4 = "C:\\Program Files\\Microsoft\\"; string vst4 = @"C:\Program Files\Microsoft\"; string rst5 = " Print \x000A Multiple \u000A Lines"; string vst5 = @" Print Multiple Lines"; Platformy Technologiczne 2012
System.String • Służy do obsługi ciągów znaków • Porównywane wg wartości • Zmodyfikowane zapisywane są pod innym adresem Platformy Technologiczne 2012
System.Text.StringBuilder • Zastosowanie do tworzenia i przetwarzania ciągów znaków • Ciągi są przechowywane w buforze – operacje są szybsze i zużywają mniej zasobów using System.Text; StringBuilder sb = new StringBuilder("Hi there."); Console.WriteLine("{0}", sb); // Print string sb.Replace("Hi", "Hello"); // Replace a substring Console.WriteLine("{0}", sb); // Print changed string Platformy Technologiczne 2012