Jag har hållit på med .NET-utveckling länge och har nyligen recenserat boken "C# Advanced Programming". Jag upptäckte att många problem som jag tidigare verkade förstå men inte förstod faktiskt långsamt kan studeras och förstås.
Så jag planerar att börja skriva ett blogginlägg om "C# Advanced Programming Series". Den kommer att hämta inspiration från begreppet från boken "C# Advanced Programming" och även referera till blogginlägg från andra experter, jag hoppas du förstår. Om något är fel, rätta det tack.
(Dessutom: Detta blogginlägg kommer inte att förklara grunderna i definitioner och grammatik.) )
Låt oss prata om att bli kommissionerad.
Delegate används i stor utsträckning i .NET. Lambda-uttryck, händelser, anonymitetsmetoder med mera kommer att vara med (håll utkik efter kommande blogginlägg).
Så vad är tillförtroelse?
På lekmannaspråk skiljer sig delegater inte från att specificera metoder, förutom att de måste ange delegatnyckelordet och inte har någon metodentitet. Du kan tänka på det som en platshållare, till exempel när du skriver kod utan att veta vad du ska hantera. Du behöver bara veta vilken parametertyp och utdata du ska införa och definiera den. Detta är metoden som förmedlas i boken att signaturen måste betyda samma sak.
Låt oss definiera en grundläggande delegering:
Genomföranderesultat:
Ser du ovanstående praktiska platser att anförtro? NämligenEn delegat kan köra vilken metod som helst med samma insamlingsparametertyp och returtyp, eller till och med en metodkö med samma signatur.
Så måste våra metodsignaturer (dvs. import- och utdataparametrar) verkligen vara exakt desamma som delegaten? Svar: Nej, vi kan inte ignorera kovarians och invers variation. Låt oss kort introducera kunskapen om kovariant och inverter.
"Kovarians" betyder att kunna använda en typ som är mer härledd än den ursprungligen specificerade härledda typen. "Inverter" syftar på förmågan att använda en typ med en mindre grad av härledning. Sedan är vår kommission också föremål för kovarians och invers.
Detta innebär att om en delegat definieras kan inte bara exakt samma signaturmetod tilldela värde till delegatvariabeln.
Om en metods parametertabell matchar delegatdeklarationen, men returnerar en härledd klass av (delegatdeklarationen returnerar typen), kan metoden också tilldelas denna delegatvariabel.
Om returtypen för en metod matchar delegatens deklaration, men argumentet är förfaderklassen till delegatdeklarationsparametertypen, kan metoden också tilldelas delegatvariabeln.
Om parametrarna och returtypen för en metod stämmer överens med antagandena i ovanstående två rader, kan metoden också tilldelas delegatvariabeln.
Följande är ett enkelt exempel på kovariant kontra inverter:
Kovarians:
Inverter:
|