Darmowy fragment publikacji:
Tytuł oryginału: C# 5.0 Pocket Reference: Instant Help for C# 5.0 Programmers
Tłumaczenie: Przemysław Szeremiota
ISBN: 978-83-246-6273-9
© 2013 Helion S.A.
Authorized Polish translation of the English edition C# 5.0 Pocket Reference,
First Edition ISBN 9781449320171 © 2012 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ści
lub 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.
Wydawnictwo HELION dołożyło wszelkich starań, by zawarte
w tej książce informacje były kompletne i rzetelne. Nie bierze
jednak żadnej odpowiedzialności ani za ich wykorzystanie,
ani za związane z tym ewentualne naruszenie praw patentowych
lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności
za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: 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/ch5lk3
Moż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ść
Leksykon kieszonkowy
Konwencje typograficzne
Korzystanie z przyk(cid:228)adowych programów
Pierwszy program w C#
Sk(cid:228)adnia
System typów
Typy liczbowe
Typ warto(cid:264)ci logicznych i operatory logiczne
Znaki i ci(cid:241)gi znaków
Tablice
Zmienne i parametry
Operatory i wyra(cid:276)enia
Instrukcje
Przestrzenie nazw
Klasy
Dziedziczenie
Typ object
Struktury
Modyfikatory dost(cid:246)pu
Interfejsy
Typy wyliczeniowe
Typy zagnie(cid:276)d(cid:276)one
Uogólnienia
Delegaty
Zdarzenia
Wyra(cid:276)enia lambda
Metody anonimowe
Wyj(cid:241)tki i instrukcja try
Enumeratory i iteratory
Typy z dopuszczaln(cid:241) warto(cid:264)ci(cid:241) pust(cid:241)
Spis tre(cid:316)ci
5
5
6
7
10
13
22
29
31
34
38
46
51
58
62
72
80
84
85
87
90
92
93
101
107
113
116
117
124
129
3
Kup książkęPoleć książkęPrzeci(cid:241)(cid:276)anie operatorów
Metody rozszerzaj(cid:241)ce
Typy anonimowe
LINQ
Wi(cid:241)zanie dynamiczne
Atrybuty
Atrybuty wywo(cid:228)ania
Funkcje asynchroniczne
Wska(cid:274)niki i kod nienadzorowany
Dyrektywy preprocesora
Dokumentacja XML
O autorach
Skorowidz
134
137
139
139
163
171
175
176
185
189
191
195
197
4
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęWi(cid:233)zanie dynamiczne
Wi(cid:241)zanie dynamiczne oznacza przesuni(cid:246)cie momentu wi(cid:241)zania — pro-
cesu ustalania typów, sk(cid:228)adowych i wywo(cid:228)a(cid:254) — od czasu kompilacji
do czasu wykonania programu. Wi(cid:241)zanie dynamiczne zosta(cid:228)o wpro-
wadzone do j(cid:246)zyka C# w wersji 4.0; ma zastosowanie, kiedy programista
wie, (cid:276)e pewna metoda, sk(cid:228)adowa czy operacja istnieje, ale kompilator nie
ma o niej informacji. Do takich sytuacji dochodzi cz(cid:246)sto w ramach
interoperacji z j(cid:246)zykami dynamicznymi (jak IronPython) i obiektami
COM, a tak(cid:276)e w sytuacjach typowych dla zastosowa(cid:254) mechanizmów
refleksji.
Typ dynamiczny jest deklarowany z kontekstowym s(cid:228)owem klu-
czowym dynamic:
dynamic d = GetSomeObject();
d.Quack();
Typ dynamiczny nakazuje kompilatorowi rozlu(cid:274)ni(cid:232) kontrol(cid:246) typów;
programista oczekuje, (cid:276)e w czasie wykonania zmienna typu d b(cid:246)dzie
posiada(cid:228)a metod(cid:246) Quack. Jedyna trudno(cid:264)(cid:232) w tym, (cid:276)e w czasie kompi-
lacji nie mo(cid:276)na tego potwierdzi(cid:232). Poniewa(cid:276) d jest zmienn(cid:241) typu dy-
namicznego, kompilator opó(cid:274)ni wi(cid:241)zanie wywo(cid:228)ania metody Quack
na rzecz d do czasu wykonania programu. Aby lepiej zrozumie(cid:232), co to
oznacza, nale(cid:276)a(cid:228)oby zdefiniowa(cid:232) rozró(cid:276)nienie pomi(cid:246)dzy wi(cid:241)zaniem
statycznym i dynamicznym.
Wi(cid:233)zanie statyczne a wi(cid:233)zanie dynamiczne
Klasycznym przyk(cid:228)adem wi(cid:241)zania jest odwzorowanie nazwy wyst(cid:246)-
puj(cid:241)cej w kompilowanym wyra(cid:276)eniu na konkretn(cid:241) metod(cid:246) czy sk(cid:228)a-
dow(cid:241). Na przyk(cid:228)ad w poni(cid:276)szym wyra(cid:276)eniu kompilator musi odszuka(cid:232)
implementacj(cid:246) metody o nazwie Quack:
d.Quack();
Za(cid:228)ó(cid:276)my, (cid:276)e statyczny typ d to Duck:
Duck d = ...
d.Quack();
W najprostszym przypadku kompilator dokonuje wi(cid:241)zania poprzez
wyszukanie bezparametrowej metody Quack w klasie Duck. Je(cid:264)li to si(cid:246)
nie powiedzie, kompilator rozszerzy poszukiwania na metody z pa-
rametrami opcjonalnymi, metody typów bazowych, a wreszcie metody
rozszerzaj(cid:241)ce, które przyjmuj(cid:241) zmienn(cid:241) typu Duck w miejsce pierwsze-
go argumentu wywo(cid:228)ania. Je(cid:264)li i to nie doprowadzi do dopasowania
Wi(cid:233)zanie dynamiczne
(cid:95)
163
Kup książkęPoleć książkęwywo(cid:228)ania do metody, kompilator zg(cid:228)osi b(cid:228)(cid:241)d kompilacji. Jak wida(cid:232),
niezale(cid:276)nie od tego, jaka metoda zostanie ostatecznie wybrana do
realizacji wywo(cid:228)ania, wybór ten jest dokonywany przez kompilator,
a samo dopasowanie wywo(cid:228)ania i metody bazuje wy(cid:228)(cid:241)cznie na infor-
macji dost(cid:246)pnej statycznie, to znaczy na widocznych w kodzie defi-
nicjach typów operandów (tutaj d). Tyle o wi(cid:241)zaniu statycznym.
Zmie(cid:254)my teraz statyczny typ zmiennej d na typ object:
object d = ...
d.Quack();
Wywo(cid:228)anie Quack sprowokuje teraz b(cid:228)(cid:241)d kompilacji, poniewa(cid:276) cho(cid:232)
warto(cid:264)(cid:232) przechowywana w d mo(cid:276)e zawiera(cid:232) metod(cid:246) Quack, kompi-
lator nie mo(cid:276)e jej zna(cid:232), gdy(cid:276) jedyn(cid:241) informacj(cid:241), jak(cid:241) dysponuje, jest
najogólniejszy z mo(cid:276)liwych typ zmiennej object. Co innego, je(cid:264)li typ
d zostanie okre(cid:264)lony jako dynamic:
dynamic d = ...
d.Quack();
Typ dynamiczny jest troch(cid:246) jak typ object, to znaczy równie ma(cid:228)o
mówi o zmiennej d. Ró(cid:276)nica polega na tym, (cid:276)e typ dynamiczny mo(cid:276)e
by(cid:232) u(cid:276)ywany w sposób nieweryfikowalny w czasie kompilacji. Opera-
cje na obiekcie deklarowanym jako dynamic b(cid:246)d(cid:241) rozstrzygane w opar-
ciu o typ obiektu ustalony w czasie wykonania programu, a nie typ
z czasu kompilacji. Kompilator, napotkawszy wyra(cid:276)enie wi(cid:241)zane
dynamicznie (czyli wyra(cid:276)enie, w którym wyst(cid:246)puje dowolna war-
to(cid:264)(cid:232) typu dynamicznego), ogranicza si(cid:246) jedynie do takiego obrobienia
wyra(cid:276)enia, (cid:276)eby wi(cid:241)zanie mog(cid:228)o zosta(cid:232) rozstrzygni(cid:246)te w czasie wy-
konania programu.
W czasie wykonania, je(cid:264)li oka(cid:276)e si(cid:246), (cid:276)e obiekt dynamiczny imple-
mentuje interfejs IDynamicMetaObjectProvider, to w(cid:228)a(cid:264)nie ten interfejs zo-
stanie wykorzystany do rozstrzygni(cid:246)cia dopasowania; w innym przy-
padku (cid:264)rodowisko wykonawcze rozstrzygnie wywo(cid:228)anie analogicznie,
jak zrobi(cid:228)by to kompilator w czasie kompilacji, to znaczy przeszuka
aktualny typ obiektu, jego typy bazowe oraz metody rozszerzaj(cid:241)ce.
Rozstrzyganie w oparciu o implementacj(cid:246) interfejsu IdynamicMetaObject
(cid:180)Binding nazywamy wi(cid:241)zaniem ze wskazania albo wi(cid:241)zaniem niestandar-
dowym (ang. custom binding), a rozstrzyganie w oparciu o dost(cid:246)pn(cid:241)
w czasie wykonania wiedz(cid:246) o typie i jego typach bazowych nazy-
wamy wi(cid:241)zaniem wed(cid:228)ug regu(cid:228) albo wi(cid:241)zaniem j(cid:246)zykowym (ang. language
binding).
164 (cid:95)
C# 5.0. Leksykon kieszonkowy
Kup książkęPoleć książkęWi(cid:233)zanie ze wskazania
Wi(cid:241)zanie ze wskazania dotyczy przypadku, kiedy obiekt typu dy-
namicznego implementuje interfejs IDynamicMetaObjectProvider (IDMOP).
Interfejs ten mo(cid:276)na co prawda implementowa(cid:232) w typach pisanych
w j(cid:246)zyku C#, ale najcz(cid:246)(cid:264)ciej dotyczy to obiektów pozyskiwanych z in-
nych j(cid:246)zyków dynamicznych z rodziny .NET, operuj(cid:241)cych w ramach
(cid:264)rodowiska wykonawczego Dynamic Language Runtime (DLR) (jak
IronPython czy IronRuby). Obiekty pochodz(cid:241)ce z tych j(cid:246)zyków nie-
jawnie implementuj(cid:241) interfejs IDMOP jako sposób bezpo(cid:264)redniego
kontrolowania znaczenia operacji, które b(cid:246)d(cid:241) na tych obiektach
wykonywane. Oto prosty przyk(cid:228)ad:
using System;
using System.Dynamic;
public class Test
{
static void Main()
{
dynamic d = new Duck();
d.Quack(); // wywo(cid:225)ano Quack
d.Waddle(); // wywo(cid:225)ano Waddle
}
}
public class Duck : DynamicObject
{
public override bool TryInvokeMember (
InvokeMemberBinder binder, object[] args,
out object result)
{
Console.WriteLine ( wywo(cid:239)ano + binder.Name);
result = null;
return true;
}
}
Klasa Duck w istocie nie posiada metody Quack, a jedynie wskazanie
wi(cid:241)zania, dzi(cid:246)ki któremu przechwytuje i interpretuje wywo(cid:228)ania wszyst-
kich metod na rzecz obiektów tej klasy.
Wi(cid:241)zania ze wskazania s(cid:241) omawiane szerzej w 20. rozdziale ksi(cid:241)(cid:276)ki
C# 5.0 in a Nutshell.
Wi(cid:233)zanie j(cid:253)zykowe
Z wi(cid:241)zaniem j(cid:246)zykowym mamy do czynienia w przypadku obiektów
dynamicznych, które nie implementuj(cid:241) interfejsu IdynamicMetaObject
(cid:180)Provider. Wi(cid:241)zanie j(cid:246)zykowe stosuje si(cid:246) przede wszystkim do ob-
Wi(cid:233)zanie dynamiczne
(cid:95)
165
Kup książkęPoleć książkęchodzenia niedogodno(cid:264)ci niedoskonale zaprojektowanych typów,
a tak(cid:276)e niektórych ogranicze(cid:254) w(cid:228)a(cid:264)ciwych systemowi typów plat-
formy .NET. Typowym problemem jest na przyk(cid:228)ad brak jednolitego
interfejsu typów liczbowych (wiemy ju(cid:276), (cid:276)e wi(cid:241)zanie dynamiczne
dotyczy metod; dopowiedzmy, (cid:276)e dotyczy równie(cid:276) operatorów):
static dynamic Mean (dynamic x, dynamic y)
{
return (x + y) / 2;
}
static void Main()
{
int x = 3, y = 4;
Console.WriteLine (Mean (x, y));
}
W takich przypadkach zalety wi(cid:241)zania dynamicznego s(cid:241) oczywiste,
bo nie trzeba powiela(cid:232) kodu wspólnych operacji obliczeniowych dla
ka(cid:276)dego z rozmaitych typów liczbowych. Wad(cid:241) jest natomiast utrata
statycznej kontroli typów, a wi(cid:246)c i ryzyko zamiany b(cid:228)(cid:246)dów kompilacji
na wyj(cid:241)tki czasu wykonania.
Uwaga
Wi(cid:241)zanie dynamiczne oznacza os(cid:228)abienie kontroli typów, ale
tylko statycznej — kontrola dynamiczna wci(cid:241)(cid:276) jest obecna. Inaczej
ni(cid:276) w mechanizmach refleksji, wi(cid:241)zanie dynamiczne nie pozwala
np. na omini(cid:246)cie regu(cid:228) widoczno(cid:264)ci sk(cid:228)adowych.
Dynamiczne wi(cid:241)zanie j(cid:246)zykowe celowo ma mo(cid:276)liwie blisko odwzo-
rowywa(cid:232) wi(cid:241)zanie statyczne (a wi(cid:246)c dzia(cid:228)a tak, jak dzia(cid:228)a(cid:228)by kom-
pilator, gdyby tylko typ dynamiczny by(cid:228) mu znany statycznie). Za-
chowanie programu z poprzedniego przyk(cid:228)adu by(cid:228)oby identyczne,
gdyby(cid:264)my jawnie oprogramowali metod(cid:246) Mean do operowania na ty-
pie int. Najbardziej znamienna ró(cid:276)nica pomi(cid:246)dzy wi(cid:241)zaniem dyna-
micznym i statycznym dotyczy metod rozszerzaj(cid:241)cych; b(cid:246)dzie o tym
mowa w punkcie „Funkcje niedynamiczne”.
Uwaga
Wi(cid:241)zanie dynamiczne wi(cid:241)(cid:276)e si(cid:246) z narzutem wydajno(cid:264)ci wykonania
programu, ale dzi(cid:246)ki mechanizmom cachowania DLR powtarzaj(cid:241)-
ce si(cid:246) wykonania tych samych wyra(cid:276)e(cid:254) wi(cid:241)zanych dynamicznie s(cid:241)
skutecznie optymalizowane, co pozwala stosunkowo wydajnie
wykonywa(cid:232) wywo(cid:228)ania dynamiczne na przyk(cid:228)ad w p(cid:246)tlach. Opty-
malizacja redukuje narzut rozstrzygni(cid:246)cia prostego wyra(cid:276)enia dy-
namicznego do oko(cid:228)o 100 ns (mowa o wspó(cid:228)czesnym komputerze).
166 (cid:95)
C# 5.0. Leksykon kieszonkowy
Kup książkęPoleć książkęWyj(cid:233)tek RuntimeBinderException
Je(cid:264)li sk(cid:228)adowej nie uda si(cid:246) zwi(cid:241)za(cid:232) dynamicznie, (cid:264)rodowisko wyko-
nawcze zg(cid:228)osi wyj(cid:241)tek RuntimeBinderException, b(cid:246)d(cid:241)cy odpowiednikiem
b(cid:228)(cid:246)du czasu kompilacji, ale wykrytym dopiero w czasie wykonania:
dynamic d = 5;
d.Hello(); // wywo(cid:225)anie zg(cid:225)osi wyj(cid:261)tek RuntimeBinderException
Wyj(cid:241)tek zg(cid:228)oszony w powy(cid:276)szym kodzie oznacza, (cid:276)e typ dynamiczny
(tu int) nie posiada metody Hello.
Reprezentacja typu dynamicznego
Typ dynamiczny cechuje si(cid:246) znacznym podobie(cid:254)stwem do typu ob-
ject — (cid:264)rodowisko traktuje na przyk(cid:228)ad poni(cid:276)sze porównanie jako
prawdziwe:
typeof (dynamic) == typeof (object)
Zasada ta rozci(cid:241)ga si(cid:246) równie(cid:276) na typy konkretyzowane typem dy-
namicznym i typy tablicowe:
typeof (List dynamic ) == typeof (List object )
typeof (dynamic[]) == typeof (object[])
Tak jak w przypadku referencji object, referencja dynamic mo(cid:276)e odno-
si(cid:232) si(cid:246) do obiektu dowolnego typu (za wyj(cid:241)tkiem typów wska(cid:274)ni-
kowych):
dynamic x = ahoj ;
Console.WriteLine (x.GetType().Name); // String
x = 123; // nie ma b(cid:225)(cid:266)du (cho(cid:252) to ta sama zmienna)
Console.WriteLine (x.GetType().Name); // Int32
Pomi(cid:246)dzy referencjami object i referencjami dynamic strukturalnie nie
ma (cid:276)adnej ró(cid:276)nicy. Referencja dynamic pozwala po prostu na dynamiczne
wi(cid:241)zanie operacji na obiekcie, do którego si(cid:246) odnosi. Mo(cid:276)na nawet
przekonwertowa(cid:232) obiekt object na typ dynamic i nast(cid:246)pnie wykona(cid:232) na
nim dowoln(cid:241) operacj(cid:246) dynamiczn(cid:241):
object o = new System.Text.StringBuilder();
dynamic d = o;
d.Append ( ahoj );
Console.WriteLine (o); // ahoj
Wi(cid:233)zanie dynamiczne
(cid:95)
167
Kup książkęPoleć książkęKonwersje typów dynamicznych
Typ dynamiczny daje si(cid:246) niejawnie skonwertowa(cid:232) na dowolny inny
typ, a tak(cid:276)e dowolny inny typ mo(cid:276)na niejawnie konwertowa(cid:232) na typ
dynamiczny. Aby jednak konwersja by(cid:228)a skuteczna, w(cid:228)a(cid:264)ciwy typ
obiektu dynamicznego musi faktycznie da(cid:232) si(cid:246) skonwertowa(cid:232) na
docelowy typ statyczny.
Poni(cid:276)szy kod sprowokuje wyj(cid:241)tek RuntimeBinderException, poniewa(cid:276)
typ int nie daje si(cid:246) niejawnie konwertowa(cid:232) na typ short:
int i = 7;
dynamic d = i;
long l = d; // OK — niejawna konwersja dzia(cid:225)a
short j = d; // wyj(cid:261)tek RuntimeBinderException
var a dynamic
Typy var i dynamic wydaj(cid:241) si(cid:246) podobne, ale w istocie zasadniczo si(cid:246)
ró(cid:276)ni(cid:241):
(cid:120) var oznacza: „niech kompilator okre(cid:264)li faktyczny typ”;
(cid:120) dynamic oznacza: „niech (cid:264)rodowisko wykonawcze okre(cid:264)li faktycz-
ny typ”.
Spójrzmy:
dynamic x = ahoj ; // statyczny typ to dynamic
var y = ahoj ; // statyczny typ to string
int i = x; // wyj(cid:261)tek wykonania
int j = y; // b(cid:225)(cid:261)d kompilacji
Wyra(cid:348)enia dynamiczne
Wi(cid:241)zanie dynamiczne mo(cid:276)e dotyczy(cid:232) pól, w(cid:228)a(cid:264)ciwo(cid:264)ci, metod, zda-
rze(cid:254), konstruktorów, indekserów, operatorów i konwersji.
Nie mo(cid:276)na pobra(cid:232) wyniku wyra(cid:276)enia dynamicznego z typem zwra-
canym void; podobnie jest w przypadku wyra(cid:276)e(cid:254) statycznych. Ró(cid:276)nica
dotyczy momentu wyst(cid:241)pienia b(cid:228)(cid:246)du (tutaj w czasie wykonania pro-
gramu).
Wyra(cid:276)enia dynamiczne to najcz(cid:246)(cid:264)ciej takie wyra(cid:276)enia, w których
uczestnicz(cid:241) dynamiczne operandy, a to dlatego, (cid:276)e najcz(cid:246)(cid:264)ciej niedo-
st(cid:246)pno(cid:264)(cid:232) statycznej informacji o typie daje efekt kaskadowy:
dynamic x = 2;
var y = x * 3; // statyczny typ y to dynamic
168 (cid:95)
C# 5.0. Leksykon kieszonkowy
Kup książkęPoleć książkęOd tej regu(cid:228)y jest kilka oczywistych wyj(cid:241)tków. Po pierwsze, rzuto-
wanie typu dynamicznego na typ statyczny daje wyra(cid:276)enie statyczne.
Po drugie, wywo(cid:228)anie konstruktora zawsze daje wyra(cid:276)enie statyczne,
nawet je(cid:264)li argumenty wywo(cid:228)ania maj(cid:241) typy dynamiczne.
Istnieje te(cid:276) kilka przypadków brzegowych, w których wyra(cid:276)enie za-
wieraj(cid:241)ce argument dynamiczny samo jest statyczne; zaliczymy tu
przekazanie indeksu do tablicy i wyra(cid:276)enia tworzenia delegatów.
Rozstrzyganie przeci(cid:233)(cid:348)e(cid:295) sk(cid:293)adowych dynamicznych
Klasycznym przyk(cid:228)adem u(cid:276)ycia wi(cid:241)zania dynamicznego jest dyna-
miczny odbiornik komunikatów, to znaczy obiekt dynamiczny jako
podmiot dynamicznego wywo(cid:228)ania metody:
dynamic x = ...;
x.Foo (123); // x odbiera wywo(cid:225)ania
Jednak zakres zastosowa(cid:254) typów dynamicznych jest szerszy i obejmuje
tak(cid:276)e dynamiczne wi(cid:241)zanie argumentów wywo(cid:228)ania metody, gdzie
rozstrzygni(cid:246)cie wywo(cid:228)ania z dynamicznymi argumentami jest przesu-
wane z czasu kompilacji do czasu wykonania:
class Program
{
static void Foo (int x) { Console.WriteLine ( 1 ); }
static void Foo (string x) { Console.WriteLine ( 2 ); }
static void Main()
{
dynamic x = 5;
dynamic y = arbuz ;
Foo (x); // 1
Foo (y); // 2
}
}
Rozstrzyganie przeci(cid:241)(cid:276)enia w czasie wykonania jest równie(cid:276) okre(cid:264)lane
mianem wielorozprowadzania albo multimetody (ang. multiple dispatch),
a stosuje si(cid:246) je mi(cid:246)dzy innymi w implementacjach wzorca projektowe-
go Wizytator.
W przypadku dynamicznych argumentów wywo(cid:228)ania metody (ale
bez dynamicznego podmiotu wywo(cid:228)ania) kompilator mo(cid:276)e przepro-
wadzi(cid:232) podstawowe sprawdziany skuteczno(cid:264)ci wywo(cid:228)ania dynamicz-
nego: sprawdzane jest wi(cid:246)c cho(cid:232)by istnienie funkcji z odpowiedni(cid:241)
nazw(cid:241) i liczb(cid:241) parametrów. Je(cid:264)li takiej metody nie ma, wiadomo, (cid:276)e
rozstrzygni(cid:246)cie dynamiczne równie(cid:276) b(cid:246)dzie nieudane, wi(cid:246)c kompilator
zg(cid:228)asza b(cid:228)(cid:241)d kompilacji.
Wi(cid:233)zanie dynamiczne
(cid:95)
169
Kup książkęPoleć książkęW przypadku wywo(cid:228)a(cid:254) z argumentami typów dynamicznych oraz
statycznych ostateczny wybór metody b(cid:246)dzie odzwierciedla(cid:228) mie-
szanin(cid:246) decyzji podj(cid:246)tych statycznie i dynamicznie:
static void X(object x, object y) {Console.Write( oo );}
static void X(object x, string y) {Console.Write( os );}
static void X(string x, object y) {Console.Write( so );}
static void X(string x, string y) {Console.Write( ss );}
static void Main()
{
object o = ahoj ;
dynamic d = pa, pa ;
X (o, d); // os
}
Wywo(cid:228)anie X(o,d) jest wi(cid:241)zane dynamicznie, poniewa(cid:276) jeden z jego
argumentów ma typ dynamic. Ale skoro typ argumentu o jest statyczny,
ju(cid:276) w czasie kompilacji wiadomo, (cid:276)e w gr(cid:246) wchodz(cid:241) jedynie dwa
pierwsze przeci(cid:241)(cid:276)enia X. Ostatecznie wybór padnie na drugie z nich,
a to ze wzgl(cid:246)du na dok(cid:228)adnie dopasowany statyczny typ o i dok(cid:228)adnie
dopasowany dynamiczny typ d. Innymi s(cid:228)owy, kompilator usi(cid:228)uje
maksymalnie wykorzysta(cid:232) statyczn(cid:241) informacj(cid:246) o typach nawet w przy-
padku wyra(cid:276)e(cid:254) dynamicznych.
Funkcje niedynamiczne
Niektórych funkcji nie mo(cid:276)na wywo(cid:228)a(cid:232) dynamicznie. Dotyczy to:
(cid:120) metod rozszerzaj(cid:241)cych (ze sk(cid:228)adni(cid:241) metod rozszerzaj(cid:241)cych),
(cid:120) dowolnych sk(cid:228)adowych interfejsu (w przypadku wywo(cid:228)a(cid:254)
przez interfejs),
(cid:120) sk(cid:228)adowych typów bazowych przykrytych typami pochodnymi.
Niemo(cid:276)no(cid:264)(cid:232) wynika z tego, (cid:276)e wi(cid:241)zanie dynamiczne potrzebuje dwóch
informacji: nazwy metody do wywo(cid:228)ania oraz obiektu, na rzecz które-
go ma si(cid:246) odby(cid:232) wywo(cid:228)anie. Ale w powy(cid:276)szych przypadkach uczestni-
czy dodatkowy typ, znany wy(cid:228)(cid:241)cznie w czasie kompilacji. J(cid:246)zyk C#
w wersji 5.0 nie daje mo(cid:276)liwo(cid:264)ci dynamicznego okre(cid:264)lenia dodatko-
wego typu.
W przypadku wywo(cid:228)ania metody rozszerzaj(cid:241)cej tym dodatkowym
typem jest klasa rozszerzaj(cid:241)ca, wybierana niejawnie na bazie dyrektyw
using widocznych w kodzie (cid:274)ród(cid:228)owym (a wi(cid:246)c widocznych tylko
w czasie kompilacji). Przy wywo(cid:228)aniach za po(cid:264)rednictwem interfejsu
dodatkowy typ jest komunikowany jawn(cid:241) albo niejawn(cid:241) konwersj(cid:241)
170 (cid:95)
C# 5.0. Leksykon kieszonkowy
Kup książkęPoleć książkę(w przypadku implementacji jawnej nie da si(cid:246) wywo(cid:228)a(cid:232) sk(cid:228)adowej
bez rzutowania na typ interfejsu). Tak samo w przypadku przykry-
wania sk(cid:228)adowych klasy bazowej: dodatkowy typ musi by(cid:232) okre(cid:264)lo-
ny albo poprzez rzutowanie, albo poprzez s(cid:228)owo kluczowe base, a oba
s(cid:241) widoczne wy(cid:228)(cid:241)cznie w czasie kompilacji.
Atrybuty
Znamy ju(cid:276) pewn(cid:241) metod(cid:246) oznaczania elementów kodu programu atry-
butami — w postaci modyfikatorów takich jak virtual czy ref. Konstruk-
cje te s(cid:241) wbudowane w j(cid:246)zyk programowania. Tymczasem mechanizm
atrybutów to rozszerzalny mechanizm przewidziany jako metoda do-
dawania do elementów kodu (zestawów, typów, sk(cid:228)adowych, warto(cid:264)ci
zwracanych itd.) w(cid:228)asnych informacji. Rozszerzalno(cid:264)(cid:232) tego rodzaju jest
wykorzystywana w implementacji us(cid:228)ug integruj(cid:241)cych si(cid:246) z samym
systemem typów, bez konieczno(cid:264)ci definiowania dla nich nowych,
osobnych s(cid:228)ów kluczowych i konstrukcji C#.
Dobrym przyk(cid:228)adem sytuacji u(cid:276)ycia atrybutów jest serializacja — pro-
ces, w którym dowolny obiekt jest zamieniany na pewn(cid:241) umówion(cid:241) re-
prezentacj(cid:246) nadaj(cid:241)c(cid:241) si(cid:246) do utrwalenia, a potem do odzyskania z niej
pierwotnego stanu obiektu. W takim procesie atrybut wyst(cid:246)puj(cid:241)cy przy
polu mo(cid:276)e okre(cid:264)la(cid:232) specyfik(cid:246) translacji pomi(cid:246)dzy reprezentacj(cid:241) tego
pola w C# a reprezentacj(cid:241) przyj(cid:246)t(cid:241) w formacie serializacji obiektów.
Klasy atrybutów
Atrybut jest definiowany poprzez klas(cid:246), która koniecznie musi dzie-
dziczy(cid:232) (wprost albo po(cid:264)rednio) z abstrakcyjnej klasy bazowej System.
(cid:180)Attribute. Do(cid:228)(cid:241)czenie atrybutu do elementu kodu programu polega na
podaniu nazwy atrybutu w nawiasach kwadratowych przed oznacza-
nym elementem kodu. Na przyk(cid:228)ad poni(cid:276)szy kod do(cid:228)(cid:241)cza do klasy
Foo atrybut ObsoleteAttribute:
[ObsoleteAttribute]
public class Foo { … }
Taki atrybut b(cid:246)dzie rozpoznany przez kompilator i przy kompilacji spo-
woduje wyprowadzenie ostrze(cid:276)enia o odwo(cid:228)aniu do typu albo sk(cid:228)ado-
wej, oznaczonych jako przestarza(cid:228)e (ang. obsolete). Przyj(cid:246)(cid:228)o si(cid:246), (cid:276)e
wszystkie nazwy typów atrybutów maj(cid:241) w sobie s(cid:228)owo „Attribute”.
W C# ta konwencja jest honorowana do tego stopnia, (cid:276)e przy do(cid:228)(cid:241)cza-
niu atrybutu do elementu w nawiasach kwadratowych nie trzeba ju(cid:276)
podawa(cid:232) przyrostka Attribute:
Atrybuty
(cid:95)
171
Kup książkęPoleć książkę196 (cid:95)
C# 5.0. Leksykon kieszonkowy
Kup książkęPoleć książkęA
abstract class, Patrz: klasa
abstrakcyjna
agregator zada(cid:254), 183
aplikacja, 9, 10
argument, 8
nazwany, 44
typowy, 94
assembly, Patrz: zestaw
atrybut, 171
CLSCompliant, 173
obiekt docelowy, 172
odwo(cid:228)ania w czasie wykonania,
174
w(cid:228)asny, 173
wywo(cid:228)ania, 175
XmlElementAttribute, 172
attribute target, Patrz: atrybut obiekt
docelowy
B
bia(cid:228)a spacja, 34
biblioteka, 9, 10
blok
catch, 117, 118, 120
finally, 117, 119, 120
instrukcji, Patrz: instrukcja blok,
Patrz: instrukcja blok
try, 117, 118, 120
b(cid:228)(cid:241)d wej(cid:264)cia-wyj(cid:264)cia, 120
boxing, Patrz: pakowanie
broadcaster, Patrz: nadawca
C
callback, Patrz: wywo(cid:228)anie zwrotne
caller info attributes, Patrz: atrybut
wywo(cid:228)ania
Skorowidz
captured variable, Patrz: zmienna
wci(cid:241)gni(cid:246)ta
cast, Patrz: rzutowanie
ci(cid:241)g znaków, Patrz: znak ci(cid:241)g
closure, Patrz: domkni(cid:246)cie
CLR, 22, 82, 177
CLS, 173
Common Language Runtime,
Patrz: CLR
Common Language Specification,
Patrz: CLS
conditional operator, Patrz: operator
warunkowy
constraint, Patrz: ograniczenie
constructor, Patrz: konstruktor
D
dane
sk(cid:228)adowe, 15
statyczne, 99
wej(cid:264)ciowe, 8, 63
wyj(cid:264)ciowe, 8
deferred execution, Patrz: operator
wykonanie opó(cid:274)nione
delegat, 18, 96, 101, 102
Action, 105, 114
Func, 105, 114
instancja, 101, 102
metoda instancji, 104
pole prywatne, 112
typ, 101, 102
uogólnienie, 100
uogólniony, 105, 107, 114
wielokrotny, 103, 104
zmienna, 102
delegatów, 184
domkni(cid:246)cie, 114, 115
dost(cid:246)pno(cid:264)(cid:232), 85
197
Kup książkęPoleć książkędowncasting, Patrz: referencja
indekser, 8, 62, 68, 87, 95, 168
rzutowanie w dó(cid:228)
dynamic type checking, Patrz: typ
kontrola dynamiczna
dyrektywa
wirtualny, 75
indexer, Patrz: indekser
inferencja, 23
instancja
preprocesora, 189, 190, 191
using, 60
warunkowa, 189
dziedziczenie, 72, 73, 78, 79, 84, 87,
88, 93
E
element, 140
enumerator, 124, 125
escape sequence, Patrz: znak steruj(cid:241)cy
event, Patrz: zdarzenie
F
funkcja, 51
finalizator, 8, 62, 70, 84
finalizer, Patrz: finalizator
fluent syntax, Patrz: sk(cid:228)adnia
kaskadowa
fully qualified type name, Patrz: typ
nazwa w pe(cid:228)ni kwalifikowana
funkcja, 8
asynchroniczna, 176, 180, 181, 183
niedynamiczna, 170
przes(cid:228)oni(cid:246)ta, 75
sk(cid:228)adowa, 15
wirtualna, 75
wysokopoziomowa, 7
wywo(cid:228)anie, 40
G
garbage collector, Patrz: mechanizm
generic method, Patrz: metoda
od(cid:264)miecania
uogólniona
generic type, Patrz: typ uogólniony
H
hermetyzacja, 85
I
identyfikator, 10, 11
IL, 61
iloczyn logiczny, 30
198 (cid:95)
Skorowidz
konwersja, Patrz: konwersja
sk(cid:228)adowa, 16
instantiation, Patrz: konkretyzacja
instrukcja, 7, 51
blok, 7, 12, 51
break, 57
continue, 57
deklaracji, 51
fixed, 186
foreach, 35, 125
goto, 57, 58
if, 52
zagnie(cid:276)d(cid:276)ona, 53, 54
if..else, 53
iteracyjna, 55
p(cid:246)tli, Patrz: p(cid:246)tla
return, 57, 58, 126, 128
skoku, 57
switch, 54
throw, 57
try, 117
using, 121, 125, 138
warunkowa, 52
wyboru, 54
wyra(cid:276)eniowa, 52
yield, 127
yield break, 128
yield return, 126
interfejs, 18, 62, 87, 96
API, 45
deklaracja, 87
IDisposable, 125
IDMOP, 165
IdynamicMetaObjectProvider, 165
IDynamicMetaObjectProvider, 165
IEnumerable, 35, 100, 139, 140
IEnumerator, 87, 100
implementacja, 89
jawna, 88
wirtualna, 89
IQueryable, 140
ISerializable, 89
Kup książkęPoleć książkękowariantny, 100
rozszerzanie, 88
sk(cid:228)adowa, 170, Patrz: sk(cid:228)adowa
interfejsu
System.
Collections.Generic.IEnumerator,
125
System.Collections.Generic.
(cid:180)IEnumerable, 127
System.Collections.Generic.
(cid:180)IEnumerator, 127
System.Collections.IEnumerable,
126, 127
System.Collections.IEnumerator,
125, 127
System.IDisposable, 121
Intermediate Language, Patrz: IL
IronPython, 163
iterator, 126, 127, 128
J
jagged array, Patrz: tablica
wyszczerbiona
j(cid:246)zyk
dynamiczny, 163
IronPython, 163
po(cid:264)redni, Patrz: IL
K
klasa, 8, 16, 18, 62, 84, 87, 93, 96
abstrakcyjna, 76
atrybut, 62
bazowa, 62, 73, 76, 77, 80
BitArray, 29
dziedziczenie, Patrz: dziedziczenie
Enumerable, 150, 151
instancja
sk(cid:228)adowe, 16
konstruktor, 78
modyfikator, 62
pochodna, 73, 76, 77
statyczna, 16, 70
string, 68
System.Array, 35
System.Attribute, 171
System.EventArgs, 110
System.Exception, 123
System.Linq.Enumerable, 140, 146
System.Text.StringBuilder, 33
TaskCompletionSource, 181
klauzula
catch, 119
inicjalizacji, 56
iteracji, 56
klucz publiczny, 86
kod
eliminacja powtórze(cid:254), 93
nienadzorowany, 185, 186
platformy, 109
uogólniony, 40
w(cid:228)asny u(cid:276)ytkowników, 109
XML, 191
(cid:274)ród(cid:228)owy, 9, 10, 189
kolejka LIFO, Patrz: LIFO
kolizja nazw, 11
komentarz, 13
dokumentuj(cid:241)cy, 191, 192
jednowierszowy, 13
wielowierszowy, 13
kompilacja, 9, 10, 44, 71, 79, 163
/checked+, 26
/unsafe, 185
b(cid:228)(cid:241)d, 27, 100, 190
czasu, 25
opcje, 26
ostrze(cid:276)enie, 190
kompilator, 9, 10, 13, 71, 112, 189
konkatenacja, 33
konkretyzacja, 15
konstruktor, 8, 16, 62, 63, 95, 168
bezparametrowy, 44, 64, 69, 79,
84, 85
klasy, 78
bazowej, 77
niejawny, 64
niepubliczny, 64
przeci(cid:241)(cid:276)anie, 64
statyczny, 69, 70
kontekst
nienadzorowany, 180
synchronizacji, 179
unsafe, 39
kontrawariancja, 99, 101, 106, 107
Spis tre(cid:316)ci
(cid:95)
199
Kup książkęPoleć książkękonwersja, 17, 73, 168
jawna, 17, 18, 24, 26, 130
liczbowa, 75
niejawna, 17, 18, 24, 130
numeryczna, 100
odpakowywania, 75, 100
przeci(cid:241)(cid:276)anie, 136
typów dynamicznych, 168
u(cid:276)ytkownika, 75, 100
kowariancja, 99, 100, 101, 106, 107
kropka, 12, 48, 59
kwalifikator, 146, 149
global, 61
kwantyfikator, 143
L
lambda, 48, 51, 113, 114, 116, 178
asynchroniczne, 184
parametr, 113
zmienne
wci(cid:241)gni(cid:246)te, 114, 115
zewn(cid:246)trzne, 114
lambda expression, Patrz: lambda
Language Integrated Query, Patrz:
LINQ
lazy execution, Patrz: operator
wykonanie leniwe
liczba, 8
ca(cid:228)kowita, 15, 18, 21, 24
16-bitowa, 27
8-bitowa, 27
rzeczywista, 23, 24
zaokr(cid:241)glanie, 28
zmiennoprzecinkowa, 24
LIFO, 80
lift, Patrz: operator po(cid:276)yczanie
LINQ, 139
element, Patrz: element
sekwencja, Patrz: sekwencja
LINQPad, 140
lista, 139
litera(cid:228), 8, 12
dos(cid:228)owny ci(cid:241)gów znaków, 32
liczb
ca(cid:228)kowitych, 23
rzeczywistych, 23
liczbowy, 23
200 (cid:95)
Skorowidz
przyrostek, 23
typ, 23
null, Patrz: null
znakowy, 31
M
makrodefinicja, 69
mechanizm
asynchronicznego wywo(cid:228)ania
funkcji, 176
atrybutów, 171
cachowania, 166
jawnego implementowania
sk(cid:228)adowej interfejsu, 88
od(cid:264)miecania, 39, 71, 186
metoda, 7, 8, 9, 15, 62, 63, 66, 87,
96, 168
Aggregate, 148
All, 149
anonimowa, 116, 117, 184
Any, 149
Append, 33
AsEnumerable, 149
AsQueryable, 149
asynchroniczna, 177, 181, 182
Average, 148
BinarySearch, 35
Cast, 149, 162
Combine.System.Delegate, 104
CompareTo, 33
Concat, 148
Contains, 33, 149
Copy, 35
Count, 148
CreateInstance, 35
cz(cid:246)(cid:264)ciowa, 71, 72
DefaultIfEmpty, 148
deklaracja, 40
Dispose, 121
Distinct, 147
double.IsNaN, 28
ElementAt, 148
ElementAtOrDefault, 148
Empty, 149
EndsWith, 33
Except, 148
Finalize, 71
Kup książkęPoleć książkęFind, 35
Find LastIndex, 35
FindIndex, 35
First, 148
FirstOrDefault, 148
float.IsNaN, 28
GetEnumerator, 125
GetLength, 36
GetType, 82
GetValue, 35
GroupBy, 148, 160
GroupJoin, 147, 156, 157, 158
IndexOf, 33, 35
Insert, 33, 34
instancji, 138
Intersect, 148
Join, 34, 147, 156, 158
Last, 148
LastIndexOf, 33, 35
LastOrDefault, 148
LongCount, 148
Max, 148
Min, 148
MoveNext, 144
nienazwana, 184
object.Equals, 28, 83, 84
object.GetHashCode, 83, 84
object.ReferenceEquals, 83
object.ToString, 84
OfType, 149, 162
OrderBy, 147, 150, 159
OrderByDescending, 147
PadLeft, 34
PadRight, 34
parametr, Patrz: parametr metody
przeci(cid:241)(cid:276)anie, 63, 79
przes(cid:228)aniana, 76
publiczna, 44
Range, 149
rekurencyjna, 39
Remove, 33, 34
Remove.System.Delegate, 104
Repeat, 149
Replace, 33
Reverse, 147
rozszerzaj(cid:241)ca, 137, 138, 150, 151, 170
wywo(cid:228)anie kaskadowe, 138
Select, 141, 147, 150
SelectMany, 147, 155
SequenceEqual, 149
SetValue, 35
Single, 143, 148
SingleOrDefault, 143, 148
Skip, 147
SkipWhile, 147
Sort, 35
Split, 34
StartsWith, 33
Substring, 34
Sum, 148
sygnatura, 63
Take, 147
TakeWhile, 147
Task.Run, 177
ThenBy, 147, 159
ThenByDescending, 147
ToArray, 149
ToDictionary, 149
ToList, 149
ToLookup, 149
ToLower, 34
ToString, 33
ToUpper, 34
Trim, 34
TrimEnd, 34
TrimStart, 34
Union, 148
uogólniona, 95, 96
WhenAll, 183
Where, 141, 147, 150
wirtualna, 75, 76, 83
wtyczka, 102
Zip, 147, 159
modyfikator
async, 184
dost(cid:246)pu, 85
internal, 85
new, 77
out, 41, 43, 44, 100
override, 75
params, 43, 44
private, 85
protected, 85
protected internal, 85
public, 85
Spis tre(cid:316)ci
(cid:95)
201
Kup książkęPoleć książkęmodyfikator
ref, 41, 42, 44, 171
this, 137
unsafe, 179
virtual, 171
multimetoda, 169
multiple dispatch, Patrz: multimetoda
N
nadawca, 107, 108
namespace, Patrz: przestrze(cid:254) nazw
NaN, 27
nawias klamrowy, 12
negacja warto(cid:264)ci wyra(cid:276)enia
logicznego, 30
nested type, Patrz: typ zagnie(cid:276)d(cid:276)ony
not a number, Patrz: NaN
null, 20, 40, 48, 75, 97, 129, 133
null coalescing operator, Patrz: znak ??
nullable type, 21, Patrz: typ
z dopuszczaln(cid:241) warto(cid:264)ci(cid:241) pust(cid:241)
O
obiekt, 39
char, 31
COM, 163
docelowy atrybutu, 172
dynamiczny, 165, 169
inicjalizator, 65
nadzorowany, 186
przeliczalny, 57, 125
referencja, 39
System.Type, 82
tworzenie, 39
zwalnianie ze sterty, 39
obs(cid:228)uga
b(cid:228)(cid:246)dów, 117
wyj(cid:241)tków, 118, 119
odbiornik komunikatów, 169
odpakowywanie, 80, 81
ograniczenie, 97, 98
operacja
arytmetyczna, 25
bitowa, 30
dzielenia, 25
iterowania, 125
na liczbach ca(cid:228)kowitych, 25
przypisania, 13
202 (cid:95)
Skorowidz
operand, 46
operator, 8, 12, 46, 62, 95, 168
agregacji, 143, 146, 148
All, 143
alternatywy dla null, 48
Any, 143
arytmetyczny, 25, 92
as, 75
Average, 143
bitowy, 26, 30, 91, 92
checked, 26
Concat, 144
Contains, 143
Count, 143
dekrementacji, 25, 26
dodawania, 92
dost(cid:246)pu do sk(cid:228)adowej przez
wska(cid:274)nik, 185, 187
dwuargumentowy, 46
eksportu, 146, 149
ElementAt, 142
elementowy, 146, 148
filtruj(cid:241)cy, 146, 147
First, 142
funkcja, 134
generuj(cid:241)cy, 146, 149
g(cid:228)ówny, 48, 49
grupowania, 146, 148
importu, 146, 149
indeksowania, 33
inkrementacji, 25, 26
is, 75
jednoargumentowy, 46, 49
konkatenacji, 33
konwersji, 146, 149
Last, 142
logiczny, 30
(cid:228)(cid:241)czenia, 146, 147, 156
(cid:228)(cid:241)czno(cid:264)(cid:232), 47
lewostronna, 48
prawostronna, 48
Max, 143
Min, 143
mno(cid:276)enia, 12, 26
new, 16
obliczenia nadzorowanego, 26
odwo(cid:228)ania, 12
Kup książkęPoleć książkęOrderBy, 150
pierwsze(cid:254)stwo, 47
pierwszorz(cid:246)dny, 46
pobrania adresu, 185
porównania, 13, 28, 29, 83, 92, 132
przeci(cid:241)(cid:276)anie, 135
porz(cid:241)dkuj(cid:241)cy, 146, 147
po(cid:276)yczanie, 131, 132
priorytet, 47, 48
projekcji, 146, 147
przeci(cid:241)(cid:276)anie, 48, 84, 134
przedrostkowy, 25
przypisania, 47, 48, 51
przyrostkowy, 25
relacji, 29, 30, 33, 132
przeci(cid:241)(cid:276)anie, 135
reszty z dzielenia, 25
Reverse, 142
Select, 141, 150
SequenceEquals, 143
Single, 142
sizeof, 92
Skip, 142
Take, 142
trójargumentowy, 46
trójwarto(cid:264)ciowy, 48, Patrz:
operator warunkowy
typeof, 96
typu wyliczeniowego, 92
unchecked, 26
Union, 144
warunkowy, 30, 48
Where, 141, 150
wykonanie leniwe, 144
wykonanie opó(cid:274)nione, 144
wy(cid:228)uskania, 185, 188
wywo(cid:228)ania metody, 46
z przypisaniem, 47
zapytania, 140, 146
kaskadowego, 149
zbiorów, 144, 146, 148
outer variable, Patrz: zmienna
zewn(cid:246)trzna
overflow, Patrz: przepe(cid:228)nienie
zakresu
override function, Patrz: funkcja
przes(cid:228)oni(cid:246)ta
P
pakowanie, 80, 81, 93
parametr, 8, 40, 43
metody, 63
nazwany, 172
opcjonalny, 40, 43, 44, 45
pozycyjny, 172
przekazywany przez referencj(cid:246),
38, 42
przekazywany przez warto(cid:264)(cid:232), 38,
41, 42
referencyjny, 63
typowy, 93, 95
deklarowanie, 96
kowariantny, 100
warto(cid:264)(cid:232) domy(cid:264)lna, 97
wyj(cid:264)ciowy, 38, 63
partially qualified name, Patrz:
przestrze(cid:254) nazw cz(cid:246)(cid:264)ciowa
kwalifikacja nazw
p(cid:246)tla, 55, 115
do-while, 55
for, 34, 55, 56
foreach, 55, 57, 116
while, 55
podklasa, Patrz: klasa pochodna
pole, 40, 62, 66, 95, 168
inicjalizacja, 62
instancji, 38
statyczne, 38
polimorfizm, 73, 106
preprocesor, 189, 190, 191
primary operators, Patrz: operator
pierwszorz(cid:246)dny
primitive type, Patrz: typ:prosty
programowanie
asynchroniczne, 183
programowanie asynchroniczne, 176
property, Patrz: w(cid:228)a(cid:264)ciwo(cid:264)(cid:232)
protokó(cid:228), 101
przeci(cid:241)(cid:276)anie, 96
przepe(cid:228)nienie zakresu, 25
przestrze(cid:254) nazw, 9, 58, 59, 60
cz(cid:246)(cid:264)ciowa kwalifikacja nazw, 60
deklaracja, 61
globalna, 59
hierarchia, 59
Spis tre(cid:316)ci
(cid:95)
203
Kup książkęPoleć książkęprzestrze(cid:254) nazw
import, 60
importowanie, 61, 138
przes(cid:228)anianie nazw, 61
System, 14, 21
System.Collections, 29, 35, 87
System.Security.Cryptography, 58
query expression, Patrz; wyra(cid:276)enie
zapytaniowe
Q
R
rectangular array, Patrz: tablica
regularna
refaktoryzacja, 86
reference type, Patrz: typ
referencyjny
referencja, 19, 29, 39, 83
konwersja, 73, 75
niejawna, 100
polimorfizm, Patrz: polimorfizm
pusta, 30, 129
rzutowanie, 73
w dó(cid:228), 73, 74, 94
w gór(cid:246), 73, 74
this, 65
rekurencja, 39
relacja, 50
rethrow, Patrz: wyj(cid:241)tek ponowne
zg(cid:228)oszenie
rozg(cid:228)aszanie, 108, 117
rzutowanie, 18, 81, 83, 93, 185, Patrz
te(cid:276): referencja rzutowanie
jawne, 81, 91, 94, 131
S
sealing, Patrz: zapiecz(cid:246)towanie
sekwencja, 140
konkatenacja, 144
lokalna, 140
wej(cid:264)ciowa, 140, 141
wyj(cid:264)ciowa, 140, 141
short-circuit, Patrz: zasada
skróconego obliczania
sk(cid:228)adnia
kaskadowa, 151, 152
wyra(cid:276)e(cid:254) zapytaniowych, 151, 152
204 (cid:95)
Skorowidz
sk(cid:228)adowa
abstrakcyjna, 76, 87
instancji, Patrz: instancja
sk(cid:228)adowa
interfejsu, 87, 89, 170
klasy, 17, 62, 76
przestarza(cid:228)a, 171
statyczna, 16, 39
typu
wyliczeniowego, 90, 91
bazowego, 170
wirtualna, 76, 84
zapiecz(cid:246)towana, 89
s(cid:228)owa kluczowe
async, 178
await, 178, 179, 180
s(cid:228)ownik, 35
s(cid:228)owo kluczowe, 10, 11
async, 176
await, 176
base, 77, 79
class, 62
default, 40
delegate, 102, 116
descending, 160
event, 108, 109
explicit, 134
fixed, 187
get, 66, 67
implicit, 134
internal, 59
into, 154, 158
kontekstowe, 12
let, 153
namespace, 59
orderby, 159
private, 59
public, 17, 59
sealed, 77
set, 66, 67
sizeof, 92
stackalloc, 187
static, 16, 70
struct, 18
this, 64, 77, 79
throw, 57
typeof, 96
Kup książkęPoleć książkęunsafe, 185
var, 45, 46
virtual, 75, 89
sta(cid:228)a, 39, 46, 69
deklaracja, 51
lokalna, 52
typ, 69
typu referencyjnego, 19
typu warto(cid:264)ciowego, 18
statement, Patrz: instrukcja
sterta, 38, 39, 186
stos, 38, 80, 95, 187
strong name assembly, Patrz: zestaw
zaprzyja(cid:274)niony podpisany
struct, Patrz: struktura
struktura, 84, 85, 87, 93, 96
Nullable, 130, 131
subclass, Patrz: klasa pochodna
subscriber, Patrz: subskrybent
subskrybent, 107, 108
suma logiczna, 30, 50
symbol specjalny, 31, 32
system generowania dokumentacji, 13
(cid:315)
(cid:264)rednik, Patrz: znak ;
T
tablica, 8, 18, 34, 43, 57, 139, 186, 187
ci(cid:241)gów znaków, 8
deklaracja, 34
dynamiczna, 35
element, 38, 40
typu warto(cid:264)ciowego, 84
inicjalizacja, 36, 37, 38
jako argument wywo(cid:228)ania
funkcji., 38
liczba wymiarów, 35
odwo(cid:228)anie
indeksowanie, 34
prostok(cid:241)tna, Patrz: tablica
regularna
regularna, 36
rozmiar, 35, 36, 37
tablic, Patrz: tablica
wyszczerbiona
warto(cid:264)ci typu bool, 29
wielowymiarowa, 36
wyra(cid:276)enia inicjalizacji, 35
wyszczerbiona, 36, 37
zagnie(cid:276)d(cid:276)ona, Patrz: tablica
wyszczerbiona
task combinator, Patrz: agregator
zada(cid:254)
typ, 9, 13
anonimowy, 139
bool, 14, 18, 21, 29, 40, 133
byte, 27
ca(cid:228)kowity, 7, 8, 24
char, 18, 21, 31, 40
ci(cid:241)gu znaków, 21
cz(cid:246)(cid:264)ciowy, 71
decimal, 23, 24, 28
delegatu, 104
dookre(cid:264)lony, Patrz: typ zamkni(cid:246)ty
double, 23, 24, 28
dynamic, 168
dynamiczny, 163, 165, 167
konwersja, 168
enum, 18, Patrz: typ
wyliczeniowy
false, 40
float, 23, 24, 28
instancja, 15, 18
int, 14, 15, 18, 22, 27
konkretyzowanie, 16
kontrola
dynamiczna, 74, 82
statyczna, 82
liczbowy, 18, 21, 22, 40
logiczny, 18, 21, 29, 40
long, 18, 22, 23, 27
model refleksji, 82
nazwa
w pe(cid:228)ni kwalifikowana, 59
kwalifikowana, 61
niedookre(cid:264)lony, Patrz: typ otwarty
obiektowy, 21
object, 21, 80
otwarty, 94
pochodny, 98
predefiniowany
warto(cid:264)ciowy, 22
predefiniowany, 13, 15, 21, 40
Spis tre(cid:316)ci
(cid:95)
205
Kup książkęPoleć książkęprosty, 14, 22
przestarza(cid:228)y, 171
referencyjny, 18, 19, 21, 29, 32, 36,
40, 42, 80, 84, 97, 129
reprezentacja, 82
RSA, 58
sbyte, 27
short, 18, 27
statyczny, 46
string, 14, 21, 32, 33
struct, 18
strukturowy, 18
synonim, 62
uint, 23
ulong, 23
uogólniony, 93, 95, 96
niezwi(cid:241)zany, 96
pochodne, 98
ushort, 27
var, 168
void, 8
warto(cid:264)ciowy, 18, 21, 32, 42, 84,
97, 185
instancja, 39
wbudowany, Patrz: typ
predefiniowany
w(cid:228)asny, 14, 15, 40
tworzenie, 18
wnioskowany, 23
wska(cid:274)nikowy, 185
wyliczeniowy, 18, 40, 90
konwersja, 91
operator, 92
z dopuszczaln(cid:241) warto(cid:264)ci(cid:241) pust(cid:241),
130, 131, 133
zagnie(cid:276)d(cid:276)ony, 62, 92, 93
zamkni(cid:246)ty, 94
z(cid:228)o(cid:276)ony, 14
zmiennoprzecinkowy, 23, 24, 27, 28
znakowy, 18, 21, 40
typ referencyjny
instancja, 39
type argument, Patrz: argument
typowy
type parameter, Patrz: parametr
typowy
206 (cid:95)
Skorowidz
U
uko(cid:264)nik, 13, 49, 132, 134
lewy, 31, 32
unboxing, Patrz: odpakowywanie
uogólnienie, 93, 96, 97, 104
delegatów, 100
kowariantne, 99
ograniczenia, 97
upcasting, Patrz: referencja
rzutowanie w gór(cid:246)
V
value type, Patrz: typ warto(cid:264)ciowy
verbatim string literal, Patrz: litera(cid:228)
dos(cid:228)owny ci(cid:241)gów znaków
void, 63, 188
void expression, Patrz: wyra(cid:276)enie
puste
W
warto(cid:264)(cid:232)
+(cid:146), 27
–0, 27
–(cid:146), 27
domy(cid:264)lna, 40, 43
Epsilon, 27
liczbowa, Patrz: litera(cid:228)
logiczna, 29
MaxValue, 27
MinValue, 27
NaN, Patrz: NaN
nieliczbowa, Patrz: NaN
pusta, Patrz: null
zwracana, 8
whitespace, Patrz: bia(cid:228)a spacja
wi(cid:241)zanie, 163
dynamiczne, 163, 166, 168
j(cid:246)zykowe, 165
ze wskazania, 165
widoczno(cid:264)(cid:232), Patrz: dost(cid:246)pno(cid:264)(cid:232)
wielorozprowadzanie, 169
w(cid:228)a(cid:264)ciwo(cid:264)(cid:232), 8, 62, 66, 67, 87, 95, 168
akcesor, 66, 67
automatyczna, 67
wirtualny, 75
wska(cid:274)nik, 185
beztypowy, 188
Kup książkęPoleć książkęwspó(cid:228)bie(cid:276)no(cid:264)(cid:232), 176
wyj(cid:241)tek, 70
DivideByZeroException, 118
IndexOutOfRangeException, 35
InvalidCastException, 81
InvalidOperationException, 131
obs(cid:228)uga, 118, 119
odwo(cid:228)ania do pustej referencji, 30
ponowne zg(cid:228)oszenie, 117
RuntimeBinderException, 167, 168
System.ArgumentException, 123
System.ArgumentNullException,
124
System.ArgumentOutOfRange
(cid:180)Exception, 124
System.InvalidOperationException,
124
System.NotImplementedException,
124
System.NotSupportedException,
124
zapytanie
kategorie, 146
kontynuacja, 154
LINQ, 86, Patrz: LINQ
z wieloma generatorami, 155
zintegrowane, Patrz: LINQ
zasada
przypisa(cid:254) oznaczonych, 39
skróconego obliczania, 30
zdarzenie, 8, 47, 62, 87, 95, 108, 168
abstrakcyjne, 109
akcesor, 112
jawny, 112
EventArgs, 107
odpalanie, 110
przes(cid:228)aniane, 109
schemat standardowy, 109
statyczne, 109
wirtualne, 75, 109
z pustym kodem obs(cid:228)ugi zdarzenia,
117
System.ObjectDisposedException,
zapiecz(cid:246)towane, 109
124
zg(cid:228)aszanie, 122
ponowne, 122
wyliczenie, Patrz: typ wyliczeniowy
wyra(cid:276)enie, 46
dynamiczne, 168
lambda, Patrz: lambda
logiczne, 56
przypisania, Patrz: operator
przypisania
puste, 46
sta(cid:228)owarto(cid:264)ciowe, 44
zapytaniowe, 151, 152
kompilacja, 152
zestaw, 9
zaprzyja(cid:274)niony, 86
zmienna, 38, 46
deklaracja, 45, 51
delegatu, 102
inicjalizacja, 45
lokalna, 7, 38, 40, 52
typowana niejawnie, 46
typu referencyjnego, 19
typu warto(cid:264)ciowego, 18
wci(cid:241)gni(cid:246)ta, 114, 115
zewn(cid:246)trzna, 114
znacznik XML, 13
znak, 31
wywo(cid:228)anie
zwrotne, 102
XML, 191, 192
X
Z
zadania agregator, 183
zapiecz(cid:246)towanie, 77
zapis wrostkowy, 46
!, 30, 49, 132, 134
!=, 29, 30, 50, 84, 92, 132, 134, 135
, 25, 49, 132, 134
, 26, 30, 49, 50, 91, 92, 132, 133,
134, 185, 187
, 30, 50
=, 51
*, 49, 132, 134, 185, 187, Patrz:
operator mno(cid:276)enia
*=, 51
., 12, 48, 59
Spis tre(cid:316)ci
(cid:95)
207
Kup książkęPoleć książkęznak
/, 13, 49, 132, 134
/=, 51, 134
;, 12
?:, 50
??, 133
@, 11, 32
, 31, 32
^, 26, 50, 92, 132, 134
^=, 51
{, 12
|, 26, 30, 50, 91, 92, 132, 133, 134
||, 30, 50
|=, 51
}, 12
~, 26, 49, 92, 132, 134
+, 33, 49, 50, 92, 103, 104, 132, 134
++, 25, 26, 48, 49, 92, 132, 134
+=, 51, 92, 103, 104, 134
, 30, 33, 50, 92, 132, 134, 135
, 26, 132, 134
=, 51
=, 30, 50, 92, 132, 135
=, 13, 47, 51, 92
-=, 51, 92, 103, 104
==, 13, 29, 30, 50, 83, 84, 92, 132,
134, 135
= , 51
, 30, 33, 50, 92, 132, 134, 135
- , 48, 185, 187
=, 30, 50, 92, 132, 135
, 26, 132, 134
=, 51
ci(cid:241)g, 31, 34, 57
(cid:228)(cid:241)czenie, 33
porównywanie, 33
wyszukiwanie, 33
interpunkcyjny, 12
specjalny, 31, 32
steruj(cid:241)cy, 31, 32
208 (cid:95)
Skorowidz
Kup książkęPoleć książkę
Pobierz darmowy fragment (pdf)