Język C# .NET Maria DEMS
Język C#. NET Język C#.NET jest to obiektowy język programowania, łączący w sobie cechy języków C++, Javy i VB. Jego składnia przypomina składnię C++, zawiera przeciążanie operatorów. Z języka Java pochodzi interfejs oraz sposób deklarowania klas (całość deklaracji w jednym miejscu), z VB zaczerpnięto zdarzenia i konstrukcję pętli For Each, używanej do przeglądania kolekcji.
Ogólna struktura programu w języku C#.NET Programy napisane w języku C#, mogą składać się z kilku plików. Każdy plik musi zawierać, co najmniej jedną przestrzeń nazw, która najczęściej składa się z innych przestrzeni nazw, klas, struktur, interfejsów, typów wyliczeniowych delegacji, stanowiących dodatek do innych przestrzeni nazw.
C#.NET - przestrzeń nazw W programie zawsze jest tworzona domyślna przestrzeń nazw - jest to przestrzeń globalna obecna w każdym pliku. Każdego identyfikatora, znajdującego się w globalnej przestrzeni, możemy używać w innej przestrzeni posiadającej nazwę. Namespace nazwa[.nazwa1]...] { deklaracje_typów; } gdzie: nazwa,nazwa1 – dowolna nazwa określająca przestrzeń nazw (może zawierać spacje) deklaracje_typów – deklaracje typów które można zdefiniować w przestrzeni nazw
C#.NET - szkielet programu Using System; namespace PrzestrzenNazw1 { class Klasa1 { } struct Struktura1 { } interface Interface1 { } delegate int Delegacja(); enum Emulator { } namespace PrzestrzeńNazw2 { } class Klasa2 { public static void Main(string[] args) { } } }
C#.NET - przestrzeń nazw Słowo kluczowe using, wykorzystywane jest jako: · Dyrektywa using, tworząca synonim przestrzeni nazw; umożliwia ona korzystanie z wszystkich składników danej przestrzeni nazw (można korzystać z typów bez wprowadzania ich pełnej nazwy), ale nie udostępnia składników zawartych w zagnieżdżonej przestrzeni nazw. · Instrukcja using, określająca zakres ważności danego obiektu na czas jego użycia; zezwala na użycie typów zawartych w przestrzeni nazw bez konieczności wprowadzania nazwy złożonej określonego typu.
C#.NET - przestrzeń nazw Przestrzenie nazw można podzielić na dwie grupy: systemowe przestrzenie nazw (wbudowane, zawarte w .NET Framework). przestrzenie zdefiniowane przez użytkownika Sposób deklaracji: using [synonim=]klasa_lub_przestrzeń_nazw; gdzie: synonim – zdefiniowana przez użytkownika nazwa określająca daną przestrzeń nazw. klasa_lub_przestrzeń_nazw- przestrzeń nazw lub nazwa klasy korzystająca z danego synonimu.
C#.NET - instrukcja using Instrukcję using stosujemy wtedy, gdy w danym miejscu programu potrzebny jest określony zasób (wyłącznie w celu wykonania określonej instrukcji). Po wykonaniu instrukcji należy wykonać metodę Dispose, która zwolni niepotrzebny już zasób (zwolnienie zasobu odbywa się także mimo braku instrukcji Dispose). Sposób deklaracji: using (wyrażenie | typ identyfikator = inicjalizator) gdzie: wyrażenie – wyrażenie w którym wywoływana jest metoda Dispose. inicjalizator – wyrażenie tworzące obiekt
C#.NET - typ referencyjny class Class – struktura danych zawierająca składniki danych (stałe, pola), składniki funkcyjne (metody, właściwości, zdarzenia, konstruktory) oraz typy zagnieżdżone. [atrybuty][modyfikatory]class identyfikator [:lista_bazowa] { ciało_klasy; } gdzie: atrybuty (opcjonalnie) – informacja deklaratywna modyfikatory (opcjonalnie) – stosowane są modyfikatory new, abstract, sealed i cztery modyfikatory dostępu identyfikator – nazwa danej klasy lista_bazowa (opcjonalnie) – zawiera nazwy jednej klasy bazowej i dowolną ilość zaimplementowanych interfejsów (oddzielonych przecinkami).
C#.NET - dziedziczenie W języku C# możliwe jest dziedziczenie składników pochodzących od tylko jednej klasy bazowej. Sposoby dziedziczenia i implementacja interfejsów jest następująca:
C#.NET - struktury Struktury reprezentują struktury danych, zawierają dane i składniki funkcyjne. Posiadają mała liczbę składników, co sprawia, że nie muszą korzystać z dziedziczenia czy tożsamości referencyjnej; w trakcie przypisania struktury kopiowana jest wartość a nie odwołanie. Typ strukturalny jest typem bezpośrednim, który może zawierać: stałe, konstruktory, pola, metody, właściwości, operatory i inne typy zagnieżdżone.
C#.NET - struktury Deklaracja struktury ma postać: [atrybuty][modyfikatory]struct identyfikator [:interfejsy] ciało[:] atrybuty (opcjonalnie)- dodatkowa informacja deklaratywna modyfikatory (opcjonalnie) – modyfikator new i modyfikatory dostępu identyfikator – nazwa struktury interfejsy (opcjonalnie) – wykaz interfejsów implementowanych przez strukturę (oddzielone przecinkami) ciało – ciało struktury zawierające deklaracje jej składników
C#.NET - struktury W przeciwieństwie do klas, struktury nie obsługują dziedziczenia; nie mogą dziedziczyć właściwości innej struktury czy klasy, nie mogą być bazą dla klasy potomnej. Jeśli do utworzenia struktury wykorzystamy operator new, wywołany zostanie odpowiedni konstruktor, Jeżeli nie korzystamy z operatora new, elementy struktury nie będą miały przypisanych początkowych wartości pól, dlatego przed wykorzystaniem takiej struktury należy zainicjować pola.
C#.NET - interfejsy Interfejs stanowi pewnego rodzaju umowę, której musi przestrzegać klasa lub struktura implementująca dany interfejs. Interfejs może dziedziczyć po wielu interfejsach bazowych, Klasa lub struktura może implementować wiele interfejsów. Interfejsy mogą zawierać sygnatury składników takich jak: metody, właściwości zdarzenia i indeksatory. Interfejs określa, jakie składniki muszą się znajdować w implementującej go klasie czy strukturze. Interfejs nie może być składnikiem przestrzeni nazw lub klasy
C#.NET - interfejsy Deklaracja interfejsu ma postać: [atrybuty][modyfikatory]interface identyfikator [:lista_bazowa] { ciało_interfejsu; } gdzie: atrybuty (opcjonalnie)- dodatkowa informacja deklaratywna modyfikatory (opcjonalnie) – modyfikator new i cztery modyfikatory dostępu identyfikator – nazwa danego interfejsu lista_bazowa (opcjonalnie) - wykaz zawierający jedną lub kilka nazw interfejsów bazowych (oddzielonych przecinkami)
C#.NET - delegacje Deklaracja delegacji definiuje typ referencyjny hermetyzujący metodę z wyszczególnionym zestawem argumentów i ze zwracanym typem. Hermetyzacja metody polega na szczegółowym określeniu liczby i typu argumentów oraz typu wartości zwracanych przez metodę. Delegacja pozwala na przesłanie funkcji jako parametru (delegacja wymaga, aby funkcja przekazywana miała taka sama strukturę jak deklaracja delegacji). Używając delegacji nie trzeba znać klasy obiektu, do której obiekt delegacji się odwołuje, jedynie typy argumentów i typ zwracany przez metodę muszą być zgodne. Dzięki temu delegacje można wywoływać “anonimowo”.
C#.NET - delegacje Deklaracja delegacji ma postać: [atrybuty][modyfikatory] delegate typ_zwracany identyfikator([parametry]) gdzie: atrybuty (opcjonalnie)- dodatkowa informacja deklaratywna modyfikatory (opcjonalnie) – modyfikator new i cztery modyfikatory dostępu typ_zwracany – typ jaki zostanie zwrócony, musi pasować do typu zwracanego przez metodę identyfikator – nazwa danej klasy parametry – lista parametrów
C#.NET - typ wyliczeniowy enum Wyliczenie stanowi odrębny typ zawierający zestaw stałych nazwanych, który jest listą wyliczeniową. Deklaracja wyliczenia ma postać: [atrybuty][modyfikatory] enum identyfikator [:typ_bazowy] { lista_wyliczenia; } gdzie: typ_bazowy (opcjonalnie) – źródłowy typ wyliczeniowy, który określa zawartość wyliczenia (domyślnie typ int) lista_wyliczenia – lista identyfikatorów wyliczenia oddzielonych przecinkami (domyślna wartość pierwszego elementu to 0, kolejne elementy mają wartość zwiększoną o 1).
C#.NET - metoda main Metoda main jest głównym segmentem programu, w którym zaczyna się i kończy jego działanie. Deklaracja tej metody znajduje się w klasie lub strukturze. Metoda main musi być metodą statyczną (static), może nie zwracać żadnej wartości (void) albo zwracać wartość typu int (int). Wewnątrz metody main tworzymy obiekty i inne metody. Metoda main umożliwia także pobieranie parametrów z wiersza poleceń.
C#.NET - metoda main Metoda main może nie zwracać żadnej wartości, wtedy jej deklaracja wygląda następująco: static void Main() { } lub zwracać wartość typu integer: static int Main() { } Metoda main może przyjmować, jako parametry, argumenty z wiersza poleceń. static void Main(string[] args) static int Main(string[] args) W obu tych przypadkach parametrem metody main jest tablica elementów typu string, które można konwertować na typy liczbowe korzystając z klasy Convert lub metody Parse.
C#.NET - modyfikatory dostępu Modyfikatory dostępu służą określeniu dostępności składnika lub typu. C#.NET wykorzystuje pięć poziomów dostępności, od największego do najmniejszego:
C#.NET - modyfikatory dostępu W deklaracji danego składnika można stosować tylko jeden modyfikator dostępu - wyjątkiem jest kombinacja protected internal. Jeżeli w deklaracji składnika nie występuje określenie dostępności, to przydzielana jest składnikowi dostępność domyślna (zależna od dostępności obiektu nadrzędnego). Słowo kluczowe base: udostępnia składniki klasy bazowej w kodzie klasy pochodnej i umożliwia wywołanie przesłoniętej metody klasy bazowej. umożliwia określenie konstruktora klasy bazowej, który będzie wykorzystywany podczas tworzenia egzemplarzy klasy pochodnej.
C#.NET - wskaźnik this Wskaźnik this odnosi się do bieżącego egzemplarza klasy, dla którego wywołano metodę. Słowa kluczowego this używa się do: określenia składników danej klasy, ukrytych poprzez stosowanie podobnych nazw, np.: public Baza(string imie, string alias) { this.imie = imie; this.alias = alias; } przekazywania obiektu jako parametru wywołania innych metod: Przelicz(this);
C#.NET - wskaźnik this deklaracji indeksatorów: Public int this[int param] { get return array[param]; } set array[param]= value; } }
if (wyrażenie) { instrukcja1; } else { instrukcja2; } Switch (wyrażenie) { case wartość1 { instrukcja1; instrukcja_skoku; } case wartość2 { instrukcja2; default { instrukcja3; instrukcja_skoku; } } C#.NET - instrukcje warunkowe
C#.NET - instrukcje iteracyjne Do { instrukcja1; instrukcja2; } while (warunek); while (warunek)
C#.NET - instrukcje iteracyjne for ([inicjowanie_wartości];[wyrażenie];[iteratory]) { instrukcja1; instrukcja2; } Wielokrotne wykonywanie instrukcji wewnętrznych dla każdego elementu znajdującego się w tablicy lub w obiekcie kolekcji. foreach (typ identyfikator in wyrażenie) { instrukcja1; instrukcja2; }
C#.NET - instrukcje skoku break –powoduje przerwanie wykonywania pętli lub instrukcji warunkowej w której się znajduje. continue – powoduje przerwanie jednego obiegu pętli; przekazuje sterowanie do następnej iteracji; goto – służy do przekazywania sterowania bezpośrednio do instrukcji oznaczonej etykietą (najczęściej do określonej etykiety case instrukcji switch albo etykiety default instrukcji switch. goto identyfikator; goto case wartość; goto default; return – powoduje przerwanie wykonywania metody i powrót sterowania do miejsca, w którym metoda została wywołana; może zwrócić wartość wyrażenia.
Literatura Dino Esposito : Tworzenie aplikacji za pomocą ASP.NET oraz ADO.NET (Microsoft Press, Wydawnictwo RM Warszawa 2002) Julian Templeman, David Vitter : Visual Studio .NET: .NET Framework. Czarna Księga (Helion 2003) Microsoft Press : Microsoft Visual C#.NET Encyklopedia (Helion 2003) Rusty Harold : XML. Księga Eksperta (Helion 2001) Scott Worley : ASP.NET. Vademecum Profesjonalisty (Helion, 2003) Steaven Holzner : XML. Vademecum Profesjonalisty (Helion2001) http://www.ASP.com http://www.ietf.org/RFC% 2069/ http://www.learnASP.com http://www.msdn.microsoft.com/vcsharp/ http://www.windows2003.pl http://www.xml.com