Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 28
1. Tablice w C# Indeksowane od zera Elementy mogą być dowolnego typu Tablice są typami referencyjnymi operator new tworzy tablicę i nadaje elementom wartości inicjalne. Strona 2 z 28
Tablice jednowymiarowe Deklaracja: string [ ] myarray ; Deklaracja i utworzenie: string [ ] myarray = new string [ 6 ] ; Deklaracja, utworzenie i inicjalizacja niestandardowymi wartościami: int [ ] myarray = new int [ ] {1, 3, 5, 7, 9; lub int [ ] myarray = {1, 3, 5, 7, 9; Strona 3 z 28
Tablice wielowymiarowe Zwykła prostokątna tablica: int [, ] myarray = new int [, ] {{1,2, {3,4, {5,6, {7,8; i tablica tablic (ang. jagged array) int [ ] [ ] myjaggedarray = new int [ 3 ] [ ] ; Deklaracja, utworzenie i inicjalizacja niestandardowymi wartościami: int [ ] [ ] myjaggedarray = { new int [ ] {1,3,5,7,9, new int [ ] {0,2,4,6, new int [ ] {11,22 ; Strona 4 z 28
2. w C# arytmetyczne: +, -, *, /, %, ++, --; logiczne i bitowe: &,, ^,!, ~, &&,, true, false, <<, >>; konkatenacji: +; Relacyjne: ==,!=, <, >, <=, >=; przypisania: =, +=, -=, *=, /=, %=, &=, =, ^=, <<=, >>=; dostępu:.; indeksu: []; rzutowania: (); warunkowy:?:; dodawamia i usuwania delegatów +, -; tworzenie obiektu: new; informacji o typie: as, is, sizeof, typeof; kontroli przepełnień: checked, unchecked; adresowania: *, ->, &; Tablice Strona 5 z 28
Operator is Użycie is sprawdza, czy obiekt jest kompatybilny z danym typem, tzn. czy rzutowanie nie zgłasza wyjątków. Uwaga: is nie bierze pod uwagę konwersji definiowanych przez użytkownika. Uwaga: operator is nie może być przeciążony Przykład 1. i f ( obj is string ){ Strona 6 z 28
Operator is składnia expression is type gdzie expression to wyrażenie typu referencyjengo Wynikiem jest true jeśli: expression jest różne od null lub rzutowanie do typu type nie powoduje zgłoszenia wyjątku. Strona 7 z 28
Operator as expr as type jest równoważne expr is type? (type)expr : (type)null string s = someobject as string ; i f ( s!= null ){ // someobject i s a string. Strona 8 z 28
Przykład 2. using System ; class Class1{ class MainClass{ static void Main (){ object [ ] objarray = new object [ 4 ] ; objarray [ 0 ] = new Class1 ( ) ; objarray [ 1 ] = h e l l o ; objarray [ 2 ] = 1 2 3. 4 ; objarray [ 3 ] = null ; for ( int i = 0 ; i < objarray. Length ; ++i ){ string s = objarray [ i ] as string ; Console. Write ( {0:, i ) ; i f ( s!= null ) Console. WriteLine ( + s + ) ; else Console. WriteLine ( not a s t r i n g ) ; / 0: not a string 1: hello 2: not a string 3: not a string / Tablice Strona 9 z 28
3. private dostęp wyłącznie z klasy zawierającej public bez ograncizeń dostępu protected dostęp wyłącznie z klasy zawierającej i jej klas potomnych internal dostęp wyłącznie w obrębie pakietu (the same assembly) protected internal dostęp w obrębie pakietu lub w klasie potomnej Strona 10 z 28
Dopuszczalność stosowania modyfikatorów Za wyjątkiem kombinacji protected internal nie można łączyć modyfiaktorów. Typy niezagnieżdżone (ang. top-level types) mogą być jedynie internal lub public; domyślnie internal. elementy wyliczenia (enum) domyślnie są public; nie dopuszcza się stosowania modyfikatorów. elementy klasy (class) domyślnie są private; dopuszcza się stosowanie wszystkich modyfikatorów. elementy struktury (stuct) domyślnie są private; dopuszcza się stosowanie modyfikatorów: public, internal i private. elementy interfejsu (interface) domyślnie są public; nie dopuszcza się stosowania modyfikatorów. Nie stosuje się modyfikatorów dostępu do przestrzeni nazw (namespace) Tablice Strona 11 z 28
4. ref out params Strona 12 z 28
Przykład użycia ref Przykład 3. class OutExample{ static void Method ( out int i ){ i = 42; static void Main (){ int value ; Method (out value ) ; // value = 42 Strona 13 z 28
Przykład użycia out Przykład 4. class RefExample{ static void Method ( ref int i ){ i = 42; static void Main (){ int val = 0 ; //parametr musi być zainicjalizowany Method ( ref val ) ; // val = 42 Strona 14 z 28
Przykład użycia params Przykład 5. Tablice public class MyClass { public static void UseParams (params object [ ] l i s t ) { for ( int i = 0 ; i < l i s t. Length ; i++ ) Console. WriteLine ( l i s t [ i ] ) ; Console. WriteLine ( ) ; public static void Main ( ) { UseParams (1, a, t e s t ) ; Strona 15 z 28
params może wystąpić tylko jeden raz. params może wystąpić tylko na końcu listy argumentów. Strona 16 z 28
Przeciążanie metod Możliwe jest przeciążanie metod różniących się sposobem przekazywania argumentu. class RefOutOverloadExample{ public void SampleMethod ( int i ) { public void SampleMethod ( ref int i ) { Strona 17 z 28
Nie mogą to być jednak ref i out. class CS0663 Example { public void SampleMethod ( ref int i ) { public void SampleMethod ( out int i ) { Powyższy kod spowoduje błąd kompilacji: compiler error CS0663: "cannot define overloaded methods that differ only on ref and out" Strona 18 z 28
5. Przykład 6. class TimePeriod { private double seconds ; public double Hours { get { return seconds / 3600; s e t { seconds = value 3600; class Program{ static void Main ( ) { TimePeriod t = new TimePeriod ( ) ; t. Hours = 24; System. Console. WriteLine ( Time in hours : + t. Hours ) ; Tablice Strona 19 z 28
Ograniczanie widzialności punktów dostępu (properties) Przykład 7. public string Name{ get{return name; protected s e t {name = value ; Uwaga: jeśli nie zdefiniowano metody set, to właściwość jest tylko do odczytu. Strona 20 z 28
6. (ang. indexers) Przykład 8. class Coll<T>{ private T [ ] arr = new T[ 1 0 0 ] ; public T this [ int i ]{ get{return arr [ i ] ; s e t { arr [ i ] = value ; class Program{ static void Main ( string [ ] args ){ Coll<string> s t r C o l l = new Coll<string >(); s t r C o l l [ 0 ] = Hello, World ; System. Console. WriteLine ( s t r C o l l [ 0 ] ) ; Słowo kluczowe this jest potrzebne w definicji indeksatora. Słowo kluczowe value, podobnie jak w metodzie set dla właściwości, jest podstawianą wartością. Tablice Strona 21 z 28
- przykład Przykład 9. public class YearClass{ const int StartDate = 1900; const int EndDate = 2050; int [ ] arr = new int [ EndDate StartDate + 1 ] ; Tablice public int this [ int num]{ get { return arr [ num StartDate ] ; s e t { arr [num StartDate ] = value ; Strona 22 z 28 public class Test{ public static void Main (){ YearClass yc = new YearClass ( ) ; yc [ 1 9 5 0 ] = 5 ;
Przykład 10. Tablice class DayCollection{ string [ ] days = { Sun, Mon, Tues, Wed, Thurs, Fri, Sat ; private int GetDay( string testday ){ int i = 0 ; foreach ( string day in days ){ i f ( day == testday ) return i ; i ++; return 1; public int this [ string day ]{ get{return (GetDay( day ) ) ; class Program{ static void Main ( string [ ] args ){ DayCollection week = new DayCollection ( ) ; System. Console. WriteLine ( week [ Fri ] ) ; System. Console. WriteLine ( week [ Made up Day ] ) ; Strona 23 z 28
Własności indeksatorów Indeksator może mieć więcej niż jeden parametr można przeciążać Strona 24 z 28
7. Łańcuchy znaków Typ string przechowuje ciągi znaków. Przykłady deklaracji: string h e l l o = Hello\nWorld! ; char l e t t e r = h e l l o [ 1 ] ; // e ; string a = \ u0068ello ; // h e l l o string path = @ c :\ Docs\Source\a. txt //zamiast c:\\docs\\source\\a. t x t Strona 25 z 28
Przykład 11. using System ; class Example { static void Method ( s ){ s+= world ; Console. WriteLine ( s ) ; // h e l l o world static void Main (){ string s= h e l l o ; Method ( s ) ; Console. WriteLine ( s ) ; // h e l l o Strona 26 z 28
Obiektu klasy string nie można zmienić - operatory podstawienia i konkatenacji tworzą nowe obiekty. string jest inną nazwą dla. Pomimo że string jest typem referencyjnym, to operatory == i!= dotyczą wartości, a nie referencji. Strona 27 z 28
Builder Klasa Builder jest zaimpementowana jako rozszerzalna tablica. Dołączanie znaków na koniec łańcucha powinno działać w zamortyzowanym czasie stałym. Przykład 12. using System ; using System. Text ; Tablice public sealed class App { static void Main ( ) { S t r i n g B u i l d e r sb = new S t r i n g B u i l d e r ( ABC, 5 0 ) ; // początkowy rozmiar 50 znaków. sb. Append(new char [ ] { D, E, F ) ; Console. WriteLine ( {0 chars : {1, sb. Length, sb. To ( ) ) ; // 6 chars : ABCDEF Strona 28 z 28