Занимавам се с .NET разработка от дълго време и наскоро рецензирах книгата "C# Advanced Programming". Открих, че много проблеми, които някога сякаш разбирах, но не разбирах, всъщност могат да се изучават и разбират бавно.
Затова планирам да започна да пиша блог пост за "C# Advanced Programming Series". Тя ще черпи от концепцията на книгата "C# Advanced Programming" и ще се позовава и на публикациите в блога на други експерти, надявам се да разбирате. Ако има нещо нередно, моля, коригирайте го.
(Също така: Този блог пост няма да обясни основите на дефинициите и граматиката.) )
Нека поговорим за въвеждането в експлоатация.
Delegate се използва широко в .NET. Ще участват лямбда изражения, събития, методи за анонимност и др. (следете за следващи публикации в блога).
И така, какво е възлагане?
С прости думи, делегатите не се различават от методите за определяне, освен че трябва да посочат ключовата дума делегат и нямат методна единица. Можеш да го възприемеш като временен елемент, например, когато пишеш код, без да знаеш с какво ще се сблъскаш. Просто трябва да знаете какъв е типът параметър и изходният тип, който ще въведете, и да ги дефинирате. Това е методът, предаден в книгата, че подписът трябва да означава едно и също.
Нека дефинираме основна делегация:
Резултати от изпълнението:
Виждате ли горното практическо място, където да се доверите? А именноДелегат може да изпълни всеки метод със същия тип параметър за въвеждане и тип на връщане, или дори опашка за метод със същия подпис.
Значи наистина ли нашите сигнатури на метода (т.е. параметрите за импорт и изход) трябва да са точно същите като на делегата? Отговор: Не, не можем да игнорираме ковариацията и обратната вариация. Нека накратко въведем знанията за ковариант и инвертор.
"Ковариация" означава възможност да използваш тип, който е по-производен от първоначално посочения производен тип. "Инвертор" означава възможността да се използва тип с по-малка степен на производно. Тогава нашата поръчка също е подложена на ковариация и обратно.
Това означава, че ако делегатът е дефиниран, не само същият метод за подпис може да присвои стойност на променливата делегат.
Ако таблицата с параметри на даден метод съвпада с декларацията на делегата, но връща производен клас на (декларацията за делегати връща типа), тогава методът може да бъде присвоен и на тази делегатна променлива.
Ако типът на връщане на даден метод съвпада с декларацията на делегата, но аргументът е класът предшественик на типа параметър за декларация на делегати, тогава методът може да бъде присвоен и на делегатната променлива.
Ако параметрите и типът на връщане на метода съвпадат с предположенията в горните два реда, тогава методът може да бъде присвоен и на делегатната променлива.
Следва прост пример за ковариантен и инверторен:
Ковариантност:
Инвертор:
|