Tytuł oryginału: C# 6.0 Pocket Reference: Instant Help for ...pdf.helion.pl/ch6lek/ch6lek.pdf ·...
Transcript of Tytuł oryginału: C# 6.0 Pocket Reference: Instant Help for ...pdf.helion.pl/ch6lek/ch6lek.pdf ·...
Tytuł oryginału: C# 6.0 Pocket Reference: Instant Help for C# 6.0 Programmers
Tłumaczenie: Przemysław Szeremiota
ISBN: 978-83-283-2446-6© 2016 Helion S.A.
Authorized Polish translation of the English edition C# 6.0 Pocket Reference ISBN 9781491927410 © 2015 Joseph Albahari, Ben Albahari.
This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całościlub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawartew tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.
Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/ch6lekMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
• Kup książkę• Poleć książkę • Oceń książkę
• Księgarnia internetowa• Lubię to! » Nasza społeczność
3
Spis treści
Konwencje typograficzne 5Korzystanie z przykładowych programów 6Pierwszy program w C# 7Składnia 10System typów 13Typy liczbowe 21Typ wartości logicznych i operatory logiczne 28Znaki i ciągi znaków 30Tablice 34Zmienne i parametry 38Operatory i wyrażenia 45Operatory na typach z dopuszczalną wartością pustą 50Instrukcje 51Przestrzenie nazw 58Klasy 62Dziedziczenie 74Typ object 81Struktury 86Modyfikatory dostępu 86Interfejsy 88Typy wyliczeniowe 91Typy zagnieżdżone 94Uogólnienia 94Delegaty 102Zdarzenia 108Wyrażenia lambda 113Metody anonimowe 116Wyjątki i instrukcja try 117
Poleć książkęKup książkę
4 Spis treści
Enumeratory i iteratory 125Typy z dopuszczalną wartością pustą 130Przeciążanie operatorów 134Metody rozszerzające 137Typy anonimowe 139LINQ 139Wiązanie dynamiczne 161Atrybuty 169Atrybuty wywołania 172Funkcje asynchroniczne 174Wskaźniki i kod nienadzorowany 182Dyrektywy preprocesora 186Dokumentacja XML 188Skorowidz 191O autorach 200
Poleć książkęKup książkę
174 C# 6.0. Leksykon kieszonkowy
Funkcje asynchroniczne
Zaczynając od wersji 5.0 języka C# na bazie słów kluczowych await i asyncwprowadzono mechanizmy asynchronicznego wywołania funkcji; programowa-nie asynchroniczne polega na tym, że funkcje o długim czasie wykonania jaknajszybciej zwracają sterowanie do miejsca wywołania, a swoją właściwą pra-cę wykonują w tle. Dla porównania wywołanie synchroniczne oznacza, żepowrót z wywołania funkcji następuje dopiero po wykonaniu całości opera-cji realizowanych przez funkcję. Programowanie asynchroniczne promujewspółbieżność: długotrwałe zadania są wykonywane współbieżnie z podstawo-wym przebiegiem wykonania programu wywołującego. Implementacja wy-wołań asynchronicznych odbywa się albo na bazie osobnego wątku, w którymwykonuje się właściwa część zadań funkcji asynchronicznych (w przypadkuzadań wymagających obliczeniowo), albo na bazie mechanizmu wywołańzwrotnych (w przypadku operacji wejścia-wyjścia).
Uwaga
Programowanie wielowątkowe, współbieżne i asynchroniczne to same w sobieobszerne zagadnienia: w książce C# 6.0 in a Nutshell poświęcono im całe dwarozdziały; szerokie omówienie znajduje się też pod adresem http://albahari.com/threading.
Weźmy za przykład poniższą metodę synchroniczną, wykonującą długo-trwałe obliczenia:
int ComplexCalculation(){ double x = 2; for (int i = 1; i < 100000000; i++) x += Math.Sqrt (x) / i; return (int)x;}
Wywołanie powyższej metody blokuje wywołującego na co najmniej kilkasekund, aż do obliczenia i zwrócenia wyniku:
int result = ComplexCalculation();// Jakiś czas później:Console.WriteLine (result); // 116
Środowisko uruchomieniowe CLR definiuje (w System.Threading. Tasks) klasęo nazwie Task<TResult>, reprezentującą operację, która kończy się w przyszłości.Instancję Task<TResult> dla zadania obliczeniowego można utworzyć za po-średnictwem metody Task.Run, która nakazuje środowisku CLR uruchomieniewskazanego delegatu w osobnym wątku, wykonywanym współbieżnie z wąt-kiem wywołującego:
Poleć książkęKup książkę
Funkcje asynchroniczne 175
Task<int> ComplexCalculationAsync(){ return Task.Run (() => ComplexCalculation());}
Powyższa metoda staje się asynchroniczna, ponieważ zwraca sterowanie dowywołującego natychmiast po wywołaniu Task.Run. Potrzebny jest tu jednak ja-kiś sposób poinstruowania środowiska przez wywołującego, co zrobić po za-kończeniu współbieżnej operacji i udostępnieniu jej wyniku. Służy do tegometoda GetAwaiter klasy Task<TResult>, która z asynchronicznym wywołaniemkojarzy tzw. kontynuację (ang. continuation):
Task<int> task = ComplexCalculationAsync();var awaiter = task.GetAwaiter();awaiter.OnCompleted (() => // Kontynuacja{ int result = awaiter.GetResult(); Console.WriteLine (result); // 116});
Powyższe oznacza: „po zakończeniu wywołaj podany delegat”. Nasza konty-nuacja najpierw pobiera wynik operacji asynchronicznej (GetResult; wywo-łanie to może też przerzucić wyjątek rzucony przez wywołanie asynchroniczne).Pobrany wynik jest następnie wypisywany na wyjście programu za pomocą wy-wołania Console.WriteLine.
Słowa kluczowe await i async
Słowo await upraszcza kojarzenie kontynuacji z wywołaniami asynchronicz-nymi. Począwszy od najprostszego scenariusza, kompilator rozwija blok:
var wynik = await wyra enie;instrukcja/instrukcje;
do czegoś w rodzaju:
var awaiter = wyra enie.GetAwaiter();awaiter.OnCompleted (() =>{ var wynik = awaiter.GetResult(); instrukcja/instrukcje;);
Uwaga
Kompilator dodatkowo emituje kod optymalizujący scenariusz synchro-nicznego (natychmiastowego) zakończenia operacji; operacja asynchronicz-na kończy się od razu najczęściej w wyniku działania wewnętrznego mechani-zmu cache, kiedy to wynik operacji jest gotowy w momencie wywołania.
Poleć książkęKup książkę
176 C# 6.0. Leksykon kieszonkowy
Dzięki temu możemy swoją asynchroniczną metodę ComplexCalculationAsyncwywołać następująco:
int result = await ComplexCalculationAsync();Console.WriteLine (result);
Żeby całość skompilować, trzeba jeszcze dodać modyfikator async do de-klaracji funkcji zawierającej wywołanie z await:
async void Test(){ int result = await ComplexCalculationAsync(); Console.WriteLine (result);}
Modyfikator async informuje kompilator, aby słowo await traktować jakosłowo kluczowe, a nie identyfikator widoczny wewnątrz metody (służy to zabez-pieczeniu kodu przed kompilacją kompilatorem starszym niż C# 5.0, w któ-rym uznanie słowa await za zwyczajny identyfikator spowodowałoby nie-poprawną kompilację). Modyfikator async można stosować tylko wobec metod(i wyrażeń lambda) bez wartości zwracanych albo zwracających wartości typuTask bądź Task<TResult>.
Uwaga
Modyfikator async działa podobnie jak modyfikator unsafe w tym sensie,że nie ma wpływu na sygnaturę czy widoczność metody; wpływa wyłącz-nie na to, jak metoda jest interpretowana i realizowana wewnętrznie.
Metody z modyfikatorem async są nazywane funkcjami asynchronicznymi, boteż zazwyczaj są w istocie asynchroniczne. Aby to uwidocznić, zobaczmy, jakprzebiega wykonanie funkcji asynchronicznej.
Po napotkaniu wyrażenia await sterowanie (zazwyczaj) wraca do wywołującego(podobnie jak w przypadku instrukcji yield return w iteratorach), ale jeszczezanim to nastąpi, środowisko wykonawcze kojarzy z oczekującym na wyko-nanie zadaniem kontynuację, aby już po zakończeniu wykonania zadaniamożliwe było podjęcie wykonania od określonego miejsca programu. Jeślizadanie asynchroniczne wykona się błędnie, rzucony przez nie wyjątek zosta-nie przerzucony do kontynuacji (jak po wywołaniu GetResult); jeśli zadaniezwróci wartość, zostanie ona przypisana do wyrażenia await.
Uwaga
Wbudowana implementacja metody OnComplete kontynuacji oczekującejna zakończenie wykonania asynchronicznego gwarantuje zachowaniebieżącego kontekstu synchronizacji (jeśli takowy istnieje). W praktyce oznacza
Poleć książkęKup książkę
Funkcje asynchroniczne 177
to, że w aplikacjach z rozbudowanym interfejsem użytkownika (WPF,WinRT, Silverlight czy Windows Forms), przy oczekiwaniu na operacjęna interfejsie użytkownika, kontynuacja będzie się wykonywać w tym samymwątku co sama operacja; jest to bardzo pomocne w zachowaniu bezpie-czeństwa wątkowego aplikacji.
Wyrażenie występujące za await to zazwyczaj zadanie, czyli egzemplarz klasy Task;może to być jednak dowolny obiekt z metodą GetAwaiter zwracającą obiekt im-plementujący interfejs INotify Completion.OnCompleted i z metodą GetResulto odpowiedniej sygnaturze (oraz z właściwością IsCompleted, służącą do spraw-dzania możliwości wykonania synchronicznego).
Zauważmy, że wyrażenie await jest obliczane jako wartość typu int; spowo-dowane jest to tym, że oczekiwaliśmy na asynchroniczne wykonanie zadaniatypu Task<int> (którego metoda GetAwaiter().GetResult() zwraca wartośćtypu int).
Możliwe jest również oczekiwanie na wykonanie zadania nieuogólnionej kla-sy Task; wyrażenie await jest wtedy wyrażeniem pustym:
await Task.Delay (5000);Console.WriteLine ("Min o pi sekund!");
Metoda Task.Delay jest statyczną metodą zwracającą obiekt Task kończącywykonanie po odczekaniu określonej liczby milisekund. Synchronicznymodpowiednikiem wywołania Task.Delay jest wywołanie Thread.Sleep.
Klasa Task to nieuogólniona klasa bazowa dla Task<TResult> i funkcjonalnie jestrównoważna klasie Task<TResult> we wszystkim poza wartością zwracaną.
Zachowanie lokalnego kontekstu
Największą siłą wyrażeń await jest to, że mogą występować w niemal dowolnymmiejscu kodu; w szczególności wyrażenie await (w obrębie funkcji asynchro-nicznej) może się pojawiać w miejscu, gdzie dozwolone jest wystąpienie do-wolnego wyrażenia za wyjątkiem wyrażenia blokady, kontekstu nienadzoro-wanego, wnętrza bloku catch lub bloku finally, kodu nienadzorowanego czy,wreszcie, punktu wejścia do wykonania (czyli głównej metody programu).
W poniższym przykładzie stosujemy wyrażenie await w ciele pętli:
async void Test(){ for (int i = 0; i < 10; i++) { int result = await ComplexCalculationAsync();
Poleć książkęKup książkę
178 C# 6.0. Leksykon kieszonkowy
Console.WriteLine (result); }}
Po pierwszym wywołaniu ComplexCalculationAsync sterowanie powraca domiejsca wywołania za wyrażeniem await. Kiedy metoda zakończy działanie(albo rzuci wyjątek), wykonanie zostanie wznowione w przerwanym miejscu,z zachowaniem wartości zmiennych lokalnych, w tym licznika pętli. Kompi-lator uzyskuje ten efekt poprzez translację powyższego kodu na maszynę sta-nową, podobnie jak w przypadku iteratorów.
Nieobecność słowa kluczowego await oznaczałaby, że to programista musiałbyjawnie oprogramować taką maszynę stanową ze starannym ręcznym stosowa-niem kontynuacji; tradycyjnie to właśnie ten element programowania asyn-chronicznego przysparza najwięcej trudności.
Pisanie funkcji asynchronicznych
W każdej funkcji synchronicznej można zastąpić pusty typ zwracany instancjąklasy Task, a funkcja ta stanie się w pełni użyteczną funkcją asynchroniczną;żadne inne zmiany nie są konieczne:
async Task PrintAnswerToLife(){ await Task.Delay (5000); int answer = 21 * 2; Console.WriteLine (answer);}
Zauważmy, że w ciele metody nie ma jawnej instrukcji zwracającej obiektzadania (Task). Zajmuje się tym kompilator, to on również obsługuje sygnali-zację zakończenia bądź przerwania wykonania metody (w przypadku wyjąt-ku). Dzięki temu można łatwo tworzyć łańcuchy wywołań asynchronicznych:
async Task Go(){ await PrintAnswerToLife(); Console.WriteLine ("Gotowe");}
(A ponieważ metoda Go zwraca Task, Go sama w sobie jest również asynchro-niczna). Kompilator rozwinie funkcję asynchroniczną zwracającą zadaniewspółbieżne Task do postaci kodu, który (pośrednio) wykorzystuje klasę Ta-skCompletionSource do utworzenia zadania współbieżnego wraz z sygnalizacjązakończenia bądź błędu.
Poleć książkęKup książkę
Funkcje asynchroniczne 179
Uwaga
TaskCompletionSource to typ środowiska uruchomieniowego CLR, po-zwalający na tworzenie zadań współbieżnych pozostających pod ręczną kon-trolą programisty, a także zajmujący się sygnalizacją zakończenia wykonaniawspółbieżnego albo błędu wykonania. W przeciwieństwie do Task.Run,TaskCompletionSource nie wiąże wątku, w którym występuje wywołanie,na czas wykonania operacji. TaskCompletionSource znajduje też zastoso-wanie przy pisaniu metod obsługujących wejście-wyjście i zwracających za-dania współbieżne (jak Task. Delay).
Chodzi o zapewnienie, by kiedy metoda asynchroniczna zwracająca zadaniewspółbieżne zakończy wykonanie, sterowanie mogło zostać przekazane (za po-średnictwem kontynuacji) do miejsca, w którym ktoś na to oczekuje.
Zwracanie Task<TResult>
Jeśli ciało funkcji synchronicznej zwraca wartość uogólnionego typu TResult,można ją zamienić na asynchroniczną poprzez zamianę wartości zwracanej naTask<TResult>:
async Task<int> GetAnswerToLife(){ await Task.Delay (5000); int answer = 21 * 2; // answer to int, więc nasza metoda zwraca Task<int> return answer;}
Działanie metody GetAnswerToLife można zademonstrować poprzez wywołaniejej wewnątrz wcześniej zdefiniowanej metody PrintAnswerToLife (która z koleijest wywoływana we wnętrzu Go):
async Task Go(){ await PrintAnswerToLife(); Console.WriteLine ("Gotowe");}async Task PrintAnswerToLife(){ int answer = await GetAnswerToLife(); Console.WriteLine (answer);}async Task<int> GetAnswerToLife(){ await Task.Delay (5000); int answer = 21 * 2; return answer;}
Poleć książkęKup książkę
180 C# 6.0. Leksykon kieszonkowy
Funkcje asynchroniczne upodobniają programowanie asynchroniczne do kla-sycznego programowania synchronicznego. Poniżej zaprezentowany jest syn-chroniczny równoważnik powyższego łańcucha wywołań, w którym wywołanieGo() daje taki sam efekt po blokującym (synchronicznym) odczekaniu pięciusekund:
void Go(){ PrintAnswerToLife(); Console.WriteLine ("Gotowe");}void PrintAnswerToLife(){ int answer = GetAnswerToLife(); Console.WriteLine (answer);}int GetAnswerToLife(){ Thread.Sleep (5000); int answer = 21 * 2; return answer;}
Powyższy przykład ilustruje też podstawową zasadę projektowania funkcjiasynchronicznych w C#, czyli pisanie metod najpierw jako synchronicznych,a następnie zastępowanie wywołań synchronicznych wywołaniami asynchro-nicznymi z oczekiwaniem na ich wykonanie współbieżne.
Współbieżność
Poznaliśmy najprostszy schemat programowania asynchronicznego, w któ-rym tuż po wywołaniu funkcji asynchronicznych oczekujemy na zakończenieodpowiadających im zadań współbieżnych. W efekcie otrzymujemy programz uszeregowanym wykonaniem, z logicznego punktu widzenia równoważny pro-gramowi w pełni synchronicznemu.
Natomiast prawdziwie współbieżne wykonanie implementujemy wtedy, kiedywywołujemy funkcje asynchroniczne bez momentalnego oczekiwania naich zakończenie. Na przykład poniższy kod dokona współbieżnego, dwu-krotnego wykonania metody PrintAnswerToLife:
var task1 = PrintAnswerToLife();var task2 = PrintAnswerToLife();await task1; await task2;
Współbieżny przebieg wykonania programu kończy się w miejscu oczekiwaniana zakończenie obu współbieżnych zadań (tam też dochodzi do kolekcjonowa-nia wyników albo rzucenia wyjątków). Klasa Task udostępnia statyczną metodęo nazwie WhenAll, agregującą oczekiwanie i przez to nieco wydajniejszą. Me-
Poleć książkęKup książkę
Funkcje asynchroniczne 181
toda WhenAll zwraca zadanie współbieżne, które kończy się, kiedy zakończą sięwszystkie zadania współbieżne wskazane w wywołaniu:
await Task.WhenAll (PrintAnswerToLife(), PrintAnswerToLife());
Metoda WhenAll to tak zwany agregator zadań (ang. task combinator; klasa Taskudostępnia również agregator o nazwie WhenAny, kończący wykonanie w momen-cie zakończenia dowolnego z przekazanych zadań). Agregatory zadań współ-bieżnych zostały szczegółowo omówione w książce C# 6.0 in a Nutshell.
Asynchroniczne wyrażenia lambda
Zwyczajne metody możemy łatwo definiować jako asynchroniczne za pomo-cą modyfikatora async:
async Task NamedMethod(){ await Task.Delay (1000); Console.WriteLine ("Ple");}
To samo dotyczy metod nienazwanych (czyli wyrażeń lambda i metod anoni-mowych), byle tylko były poprzedzone słowem async:
Func<Task> unnamed = async () =>{ await Task.Delay (1000); Console.WriteLine ("Ple");};
Analogicznie możemy też stosować wyrażenie await z metodami anonimo-wymi i wyrażeniami lambda:
await NamedMethod();await unnamed();
Asynchroniczne wyrażenia lambda są przydatne przy dołączaniu delegatów ob-sługi rozmaitych zdarzeń:
myButton.Click += async (sender, args) =>{ await Task.Delay (1000); myButton.Content = "Gotowe";};
Otrzymujemy w ten sposób bardziej zwarty i lepiej umiejscowiony kod ob-sługi zdarzenia, który zresztą poza tym jest równoważny poniższemu:
myButton.Click += ButtonHandler;...async void ButtonHandler (object sender, EventArgs args){
Poleć książkęKup książkę
191
Skorowidz
A
akcesor, 112właściwości, Patrz:
właściwość akcesoraplikacja, 9argument, Patrz też:
parametrdynamiczny, 168nazwany, 44przekazywanie, 40,
41, 42assembly, Patrz: zestawatrybut, 169
CLSCompliant, 170obiekt docelowy, 170ObsoleteAttribute,
169odwołanie, 172parametr, 170własny, 171wywołanie, 172XmlElementAttribute,
170attribute target, Patrz:
atrybut obiektdocelowy
B
biblioteka, 9, 10blok
catch, 117, 118, 119finally, 117, 119, 120instrukcji, 7, 12, 51try, 117
broadcaster, Patrz: nadawca
C
caller info attribute,Patrz: atrybutwywołanie
ciągłączenie, 32porównywanie, 33przeszukiwanie, 33znaków, 31, 32
constructor, Patrz:konstruktor
custom binding, Patrz:wiązanieniestandardowe
D
daneskładowe, 15, 16statyczne, 100wejściowe, 8, 63wyjściowe, 8
delegat, 102, 103, 108Action, 105do metody
instancji, 104statycznej, 105
Func, 105modyfikowalność, 104typ, 102
kontrawariancja, 107kowariancja, 106,
107
uogólniony, 105zgodność, 106
uogólniony, 107wielokrotny, 103, 104
domknięcie, 114dyrektywa
#define, 187#elif, 187#else, 187#endif, 187#endregion, 187#error, 186, 187#if, 187#line, 187#pragma, 187#region, 187#undef, 187#warning, 186, 187preprocesora, 186, 187using, 59using static, 60
dziedziczenie, 74, 80, 81,88, 89
po klasie, 74
E
enumerator, 125escape sequence,
Patrz: znak sterującyevent, Patrz: zdarzenieexception filter,
Patrz: wyjątek filtr
Poleć książkęKup książkę
192 Skorowidz
F
finalizator, 8, 72, 86finalizer, Patrz: finalizatorflaga, 92fluent syntax, Patrz:
wyrażenie składniakaskadowa
fully qualified type name,Patrz: typ nazwaw pełni kwalifikowana
funkcjaasynchroniczna, 174,
178, 179niedynamiczna, 168przesłanianie, 77składowa, 15, 79,
Patrz też: metodasynchroniczna, 178wirtualna, 77wywołanie, 39
asynchroniczne, 174synchroniczne, 174
G
garbage collector,Patrz: mechanizmodśmiecania
generic method, Patrz:metoda uogólniona
generic type, Patrz:uogólnienie
I
identyfikator, 10interfejs, 163indekser, 8, 69
implementowanie, 70wirtualny, 77
indexer, Patrz: indekserinferencja, 23instancja, 15
składowa, 16typu
wartościowego, 39
instantiation,Patrz: konkretyzacja
instrukcja, 7, 51blok, Patrz: blok
instrukcjibreak, 57continue, 57deklaracji, 52do-while, 55fixed, 183for, 55, 56foreach, 35, 55, 57,
125goto, 57, 58if, 53if..else, 53iteracyjna, Patrz:
instrukcja pętlipętli, 55return, 57, 58, 128skoku, 57switch, 54, 57throw, 57, 122, 123try, 117, 120using, 121warunkowa, 52while, 55wyrażeniowa, 52,
Patrz też: wyrażenieyield, 128yield break, 128
interfejs, 82, 88, 90deklaracja, 88dziedziczenie, 89IComparable, 136IdynamicMetaObject
Binding, 163IDynamicMetaObject
Provider, 163, 164IEnumerable, 35, 101,
125, 127, 128IEnumerator, 101, 127implementacja
jawna, 89ponowna, 90wirtualna, 90
INotifyCompletion.OnCompleted,
177rozszerzanie, 138składowa, 168System.Collections.
Generic.IEnumerable, 128
System.Collections.Generic.IEnumerator, 125, 128
System.Collections.IEnumerable,
126, 128System.Collections.
IEnumerator,125, 128
System.IDisposable,121
interpolated string,Patrz: ciąg znakówinterpolowany
iterator, 126, 127, 128sekwencja złożona,
129
J
jagged array, Patrz: tablicawyszczerbiona
K
klasa, 9, 62, 88abstrakcyjna, 78bazowa, 74, 75, 78Console, 9definiowanie, 62dziedziczenie,
Patrz: dziedziczeniepo klasie
Enumerable, 149, 150nazwa, 10object, 82, 84
Poleć książkęKup książkę
Skorowidz 193
pochodna, 74, 75, 78,80, Patrz też:podklasa
pochodne, 78statyczna, 71string, 34, 69System.Array, 35System.Console, 71System.EventArgs, 110System.Exception, 123System.Math, 71
kod nienadzorowany, 183kod XML, 188kolejka
LIFO, Patrz: stoskolekcja, 126komentarz
dokumentujący, 188jednowierszowy, 13wielowierszowy, 13
kompilator, 9, 10, 187komunikat, 187konkretyzacja, 15konstruktor, 8, 64, 80
bezparametrowy, 65,86
kolejność, 81niepubliczny, 65obiektu, 16przeciążanie, 64statyczny, 71wywoływany, 65
kontrawariancja, 100, 101,107
konwencja wielbłądzia, 11kowariancja, 100, 101, 106,
107kwalifikator, 148
global::, 62kwantyfikator, 143, 144
L
lambda expression, Patrz:wyrażenie lambda
language binding,Patrz: wiązaniejęzykowe
Language IntegratedQuery, Patrz: LINQ
LINQ, 139, 140, 150element, 140sekwencja, 140złączenie,
Patrz: złączenielista, 69literał, 8, 12
ciągu znaków, 32liczb, 22
M
mechanizmatrybutów, 169LINQ, Patrz: LINQodśmiecania, 39, 72
metoda, 7, 15, 63Aggregate, 148All, 148anonimowa, 116Any, 148AsEnumerable, 148AsQueryable, 148Average, 148BinarySearch, 35Cast, 148CompareTo, 33Concat, 147Contains, 148Copy, 35Count, 148CreateInstance, 35częściowa, 73deklaracja, 40Display, 122Dispose, 121Distinct, 146ElementAt, 147ElementAtOrDefault,
147Empty, 148
Equals, 84, 85Except, 147Finalize, 72Find, 35Find LastIndex, 35FindIndex, 35First, 147FirstOrDefault, 147GetHashCode, 85GetLength, 36GetResult, 177GetType, 84GetValue, 35GroupBy, 147GroupJoin, 147, 155,
156IndexOf, 35Insert, 34instancji, 104, 139Intersect, 147IsCapitalized, 137Join, 147, 155Last, 147LastIndexOf, 35LastOrDefault, 147LongCount, 148Main, 9Max, 148Min, 148MoveNext, 144nazwa, 10, 63OfType, 148OnComplete, 176OrderBy, 147, 149OrderByDescending,
147PadLeft, 34PadRight, 34parametr,
Patrz: parametrprzeciążanie, 64, 81Range, 148ReferenceEquals, 85Remove, 34Repeat, 148Reverse, 147
Poleć książkęKup książkę
194 Skorowidz
metodarozszerzająca, 137,
139, 141, 168wywołanie
kaskadowe, 138Select, 141, 146, 149SelectMany, 146SequenceEqual, 148SetValue, 35Single, 147Skip, 146SkipWhile, 146skrócona do
wyrażenia, 63Sort, 35statyczna, 65Substring, 34Sum, 148sygnatura, 63Take, 146TakeWhile, 146ThenBy, 147ThenByDescending,
147ToArray, 148ToDictionary, 148ToList, 148ToLookup, 148ToLower, 34ToString, 85ToUpper, 34Trim, 34TrimEnd, 34TrimStart, 34Union, 147uogólniona, 96wartość zwracana, 8Where, 146, 149wirtualna, 77, 78WriteLine, 9Zip, 147
modyfikatorasync, 176, 181await, 176, 177dostępu
internal, 87private, 87
protected, 87protected internal,
87public, 86
out, 40, 42params, 42readonly, 63ref, 40, 41, 169this, 137unsafe, 176virtual, 169
multimetoda, 168multiple dispatch,
Patrz: multimetoda
N
nadawca, 108namespace, Patrz:
przestrzeń nazwnested type, Patrz: typ
zagnieżdżonynull coalescing operator,
Patrz: operator ??nullable type, Patrz: typ
z dopuszczalnąwartością pustą
null-conditional operator,Patrz: operator ?.
O
obiekt, 38inicjalizator, 65instancja, Patrz:
instancjakonstruktor, Patrz:
konstruktor obiektunadzorowany, 183przeliczalny, 125System.Object, 81System.Type, 84tablicy, 35tworzenie, 38typ, Patrz: typType, 97
obliczenie nadzorowane,25
odbiornik komunikatów,167
odpakowywanie, 82operand, 45operator, 8, 12, 45, 47,
Patrz też: znak!= , 29, 49, 93, 132,
134przeciążanie, 85
&, 26, 49, 93, 133,134, 182
&&, 29?., 50?:, 49??, 50, 134^, 26, 49, 93, 133, 134|, 26, 49, 93, 133, 134||, 29, 49~, 26, 93, 133+, 32<<, 26==, 131, 134
przeciążanie, 85>>, 26addytywny, 48agregacji, 143, 144,
145All, 143alternatywy dla null,
47Any, 143arytmetyczny, 24, 93as, 49, 76Average, 143await, 48bitowej sumy
wyłączającej, 49bitowy, 26, 93Cast, 160checked, 25, 26, 48Concat, 143Contains, 143Count, 143default, 48
Poleć książkęKup książkę
Skorowidz 195
dekrementacji, 25dostępu przez
wskaźnik, 182, 184dwuargumentowy, 45
zapis wrostkowy, 45elementowy, 142, 144,
147Elvis, Patrz: operator ?.Except, 144First, 142FirstOrDefault, 142funkcja, 135główny, 47GroupBy, 159, 160GroupJoin, 155iloczynu bitowego, 49iloczynu logicznego,
49inkrementacji, 25Intersect, 144is, 49, 77jednoargumentowy,
45, 48Join, 155konwersji, 144, 145lambda, 47, 49Last, 142łączność, 46
lewostronna, 47prawostronna, 47
Max, 143Min, 143mnożenia, 12multiplikatywny, 48nameof, 47, 73new, 16, 47obliczenia
nadzorowanego,Patrz: operatorchecked
odwołania doskładowej, 12
OfType, 160pierwszorzędny, 45pobrania adresu, 182
porównania, 29, 49,84, 93, 132, 135
pożyczanie, 131, 132priorytet, 46, 47przeciążanie, 134,
135, 136przesunięć bitowych,
48przypisania, 13, 46, 47,
49relacji, 29, 48, 132, 135Reverse, 142równości, 29SelectMany, 154SequenceEquals, 143Single, 142sizeof, 48, 93Skip, 142stackalloc, 47struktury Nullable,
131, 132, 133sumy bitowej, 49sumy logicznej, 49Take, 142ToArray, 144ToDictionary, 144ToList, 144, 145ToLookup, 144trójargumentowy, 45trójwartościowy, 47typeof, 47, 97typu wyliczeniowego,
93unchecked, 26, 48Union, 143warunkowego dostępu
do składowej,Patrz: operator ?.
warunkowy, 47, 49Where, 140wyłuskania, 182XOR, 49zapytania, 141, 144,
145, 146, 147kaskadowy, 149
zapytania, 141
zbiorów, 143złączenia, 155
P
pakowanie, 82, 83parametr, 8, 38, 40, 63,
114, Patrz też:argument
opcjonalny, 43typowy, 95
deklarowanie, 96wartość domyślna,
98partially qualified name,
Patrz: przestrzeń nazwnazwa częściowakwalifikacja
pętla, Patrz: instrukcjapętli
platforma .NETFramework, 9
plik.cs, 9.dll, 9.exe, 9csc.exe, 10
podklasa, 74podzapytanie, 145pole, 38, 39, 63
deklarowanie, 63inicjalizacja, 63instancji, 38publiczne, 67statyczne, 38
polimorfizm, 74preprocesor, 186, 187
symbol#error, 186#warning, 186
primary operator,Patrz: operatorpierwszorzędny
programowanieasynchroniczne, 174,178, 179
Poleć książkęKup książkę
196 Skorowidz
property, Patrz:właściwość
protokół, 102przesłanianie, 79przestrzeń nazw, 9, 58, 59,
138alias, 62deklaracja, 62globalna, 59importowanie, 59, 62nazwa
częściowakwalifikacja, 61
przesłanianie, 61zasięg, 61
System, 9, 14System.Collections, 35
przypisanie oznaczone, 39przyrostek
D, 23L, 23liczbowy, 23U, 23
Q
query expression, Patrz:wyrażenie zapytaniowe
R
rectangular array, Patrz:tablica regularna
referencja, 29, 41dynamic, 165object, 165polimorficzna, 74pusta, 130rzutowana
jawnie, 75niejawnie, 75w dół, 75, 76w górę, 75
this, 65, 66
S
sealing, Patrz:zapieczętowanieimplementacji
serializacja, 169słownik, 35, 69, 85, 126słowo kluczowe, 11
async, 174, 176, 181await, 174, 175, 177base, 79class, 62const, 70default, 40, 98delegate, 116dynamic, 161explicit, 134fixed, 185implicit, 134internal, 59into, 153kontekstowe, 12let, 152namespace, 59orderby, 158partial, 72private, 59public, 59stackalloc, 184static, 16, 71this, 64, 66, 79unsafe, 182var, 44virtual, 77
stała, 13, 45, 70deklarowanie, 70
statement, Patrz:instrukcja
sterta, 38stos, 38, 82, 184struktura, 86, 88
Nullable, 130operatory, 131
strumień wejścia-wyjścia, 9subclass, Patrz: podklasa
subscriber, Patrz:subskrybent
T
tablica, 34, 184deklaracja, 34dynamiczna, 35element, 38inicjalizacja, 35, 37, 39kopiowanie, 35liczb całkowitych, 35liczba wymiarów, 35mieszająca, 85nieposortowana, 35posortowana, 35regularna, 36
deklaracja, 36rozmiar, 35sortowanie, 35tworzenie, 35typ, 36wielowymiarowa, 36wyszczerbiona, 36, 37wyszukiwanie, 35zagnieżdżona,
Patrz: tablicawyszczerbiona
typ, 13anonimowy, 139bazowy, 168bool, 14, 21, 28, 40byte, 21, 22, 26całkowitoliczbowy, 8,
17przepełnienie, 25
char, 21, 30, 40ciągu znaków, 21częściowy, 72decimal, 21, 22, 23, 28delegatu, 102
kontrawariancja, 107kowariancja, 106,
107uogólniony, 105zgodność, 106
Poleć książkęKup książkę
Skorowidz 197
dookreślony, Patrz:typ zamknięty
dostępność, 88double, 21, 22, 23, 28dynamiczny, 165
konwersja, 166enum, 91false, 40float, 21, 22, 23, 28int, 8, 14, 15, 21, 22, 35kontrola, 83konwersja, 24, 136, 166
jawna, 24niejawna, 24, 26
liczbowy, 21, 40, 86logiczny, 14, 21, 28, 40long, 17, 21, 22, 23nazwa
kolizja, 62w pełni
kwalifikowana, 59niedookreślony,
Patrz: typ otwartyniejawnie
konwertowany, 23niemodyfikowalny, 69obiektowy, 21object, 21, 81, 82, 165ObsoleteAttribute,
169, 170odwołanie, 59otwarty, 95, 97predefiniowany, 13,
14, 15, 21, 40referencyjny, 21, 29, 31,
36, 38, 41, 63, 130sbyte, 21, 22, 26short, 21, 22, 26string, 14, 21, 31, 33uint, 21, 22, 23ulong, 21, 22, 23uogólniony,
Patrz: uogólnienieushort, 21, 22, 26void, 63, 104wartościowy, 21, 31,
39, 86, 182
wartośćdomyślna,
Patrz: wartośćdomyślna
wbudowany, Patrz:typ predefiniowany
własny, 14wnioskowany, 23wskaźnikowy, 182wyliczeniowy, 40, 91,
92konwersja, 92
z dopuszczalnąwartością pustą, 130konwersja, 131, 133pakowanie, 131
zagnieżdżony, 94zamknięty, 95znakowy, 21, 40
type argument, Patrz:argument typowy
type parameter, Patrz:parametr typowy
operator, 84argument, 95
U
uogólnienie, 94, 95, 96ograniczenia, 98pochodne, 99
V
verbatim string literal,Patrz: literał ciąguznaków dosłowny
void expression, Patrz:wyrażenie puste
W
wartośćdomyślna, 40, 43, 63,
92minus 0, 27
minusnieskończoność, 27
NaN, 27null, 36, 40, 104, 130plus nieskończoność,
27whitespace, Patrz: znak
biała spacjawiązanie
dynamiczne, 161, 162,163, 164, 165, 167
językowe, 163, 164, 165niestandardowe, 163statyczne, 162według reguł, 163ze wskazania,
Patrz: wiązanieniestandardowe
wielorozprowadzanie,Patrz: multimetoda
wiersz poleceń, 10właściwość, 8, 66
akcesor, 67, 68get, 67, 69poziom dostępności,
69set, 67, 68, 69
automatyczna, 68inicjalizacja, 68
Length, 35Rank, 35skrócona do wyrażenia,
68this, 70wirtualna, 77wyłącznie do
odczytu, 67zapisu, 67
wskaźnik beztypowy, 185współbieżność, 174, 179,
180wyjątek
czasu wykonania, 133,165
DivideByZeroException, 118
Poleć książkęKup książkę
198 Skorowidz
wyjątekfiltr, 120IndexOutOfRange
Exception, 35InvalidCastException,
83NullReference
Exception, 50OverflowException,
25RuntimeBinder
Exception, 165,166
System.ArgumentException, 124
System.ArgumentNullException, 122,
124System.ArgumentOut
OfRangeException, 124
System.InvalidOperationException,
124System.NotImple
mentedException,124
System.NotSupportedException, 124
System.ObjectDisposedException, 124
typ, 119OutOfMemory
Exception, 119System.Exception,
119WebException, 120zgłaszanie, 122
ponowne, 122, 123wyrażenie, 45, 52, 63, 65
dynamiczne, 167lambda, 113, 114
asynchroniczne, 181zmienna
wciągnięta, 114,115
zmiennazewnętrzna, 114
logiczne, 29przypisania, 46puste, 45składnia
kaskadowa, 150,151
wyrażeniowa, 150,151
zapytaniowe, 150, 156
X
XML, 188znacznik
c, 189code, 190example, 189exception, 189include, 190list, 190para, 190param, 189paramref, 190permission, 189remarks, 189returns, 189see, 190seealso, 190summary, 189
Z
zapieczętowanieimplementacji, 79
zapytanie, 140, 150, 153zintegrowane, 139,
Patrz też: LINQzasada przypisań
oznaczonych, 39zdarzenie, 8, 108
akcesor,Patrz: akcesor
EventArgs, 107implementacja, 109
KeyEventArgs, 107MouseEventArgs, 107nadawca,
Patrz: nadawcasubskrybent,
Patrz: subskrybentwirtualne, 77
zestaw, 9zaprzyjaźniony, 87
Zip, Patrz: złączeniesuwakowe
złączenie, 155suwakowe, 157
zmienna, 13, 38, 45deklaracja, 44inicjalizacja, 44lokalna, 38, 39, 52,
114nazwa, 10
znak!, 48, 133, 134!=, 29, 49, 85, 93, 132,
134$, 32%, 24, 48, 133, 134&, 26, 48, 49, 93, 133,
134, 182, 184&&, 29, 49&=, 49(), 47, 48(), 12*, 12, 24, 48, 133, 134,
182, 184*/, 13*=, 49., 12, 47/, 24, 48, 133, 134/*, 13//, 13/=, 49;, 12?, 130?., 48?:, 49??, 134@, 11
Poleć książkęKup książkę
Skorowidz 199
znak[], 47^, 26, 49, 93, 133, 134^=, 49{, 12|, 26, 49, 93, 133, 134||, 29, 49|=, 49}, 12~, 26, 48, 93, 133, 134+, 24, 32, 48, 93, 133,
134
++, 25, 47, 48, 93, 133,134
+=, 49, 93<, 29, 48, 93, 132, 134<<, 26, 48, 133, 134<<=, 49<=, 29, 48, 93, 132=, 12, 46, 49, 93-=, 49, 93==, 13, 29, 49, 85, 93,
131, 132, 134=>, 49
>, 29, 48, 93, 132, 134->, 47, 182, 184>=, 29, 49, 93, 132>>, 26, 48, 133, 134>>=, 49biała spacja, 34ciąg, Patrz: ciąg
znakówinterpunkcyjny
języka C, 12sterujący, 30
Poleć książkęKup książkę