Добрый день всем.
В C# я новичок и когда встретил такую конструкцию начал чесать репу — она покраснела и воспалилась, но результата не дала )
private delegate RV Function<RV, A>(A a);
можно простыми словами объяснить что тут объявлено
Спасибо
Здравствуйте, _FRED_, Вы писали:
_FR>Делегат. Точнее — generic delegate. Подробнее о дженериках вообще и generic delegate можно прочитать в статьях на этом сайте:
_FR>
_FR>ОбобщенияАвтор(ы): Эндрю Троелсен
Дата: 30.09.2006
Глава из книги "Язык программирования C# 2005 (Си Шарп) и платформа .NET 2.0 "
[q]С появлением .NET 2.0 язык программирования C# стал поддерживать новую возможность CTS (Common Type System — общая система типов), названную обобщениями (generics). Упрощенно говоря, обобщения обеспечивают программисту возможность определения “заполнителей” (формально называемых параметрами типа) для аргументов методов и определений типов, которые будут конкретизированы во время вызова обобщенного метода или при создании обобщенного типа.[/q]
_FR>Нововведения в C# 2.0Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#
_FR>
Спасибо за ссылки, но был бы Вам очень признателен если бы еще и написали своими словами что тут объявлено
в тексте встречается такое объявление локальной переменной
...
Function<string, IAsyncResult> endHandler = delegate
{
...
}
....
и без объявления
private delegate RV Function<RV, A>(A a);
вышеописанное объявление не проходило, а после стало компилится — как объявление приватного делегата связано с определением endHandler?
связь какаято непонятная
Здравствуйте, Аноним, Вы писали:
А>в тексте встречается такое объявление локальной переменной
А>...
А> Function<string, IAsyncResult> endHandler = delegate
А> {
А> ...
А> }
А>....
А>и без объявления
А>private delegate RV Function<RV, A>(A a);
А>вышеописанное объявление не проходило, а после стало компилится
"Function<string, IAsyncResult>" в объявлении "endHandler" — это тип переменной "endHandler".
"delegate RV Function<RV, A>(A a)" — это объявление типа. Естественно, пока объявления типа небыло (просто "не проходило" писать нельзя: нужно писать "не проходило, при компиляции возникала ошибка такая-то") программа не компилировалась.
А>- как объявление приватного делегата связано с определением endHandler?
А>связь какаято непонятная
Делегат — это тип данных. В некотором роде "специальных тип", потому что объявлеется специальным синтаксисом. Точно так же и enum — это специальный тип, который объявляется своим синтиксисом.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>>private delegate RV Function<RV, A>(A a);
А>>Объявляется приватный обобщенный делегат возвращающий значение типа RV и принимающий параметр типа А.
А>Спасибо!
А>а что такое а маленькое в (A a)?
в тексте программы затем встречается определение локальной переменной
Function<string, IAsyncResult> endHandler = delegate {.....}
без объявления private delegate RV Function<RV, A>(A a); вышеуказанная конструкция не компилилась, непойму как они связаны
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>>>private delegate RV Function<RV, A>(A a);
А>>>Объявляется приватный обобщенный делегат возвращающий значение типа RV и принимающий параметр типа А.
А>>Спасибо!
А>>а что такое а маленькое в (A a)?
А>в тексте программы затем встречается определение локальной переменной
А>А>Function<string, IAsyncResult> endHandler = delegate {.....}
А>
А>без объявления private delegate RV Function<RV, A>(A a); вышеуказанная конструкция не компилилась, непойму как они связаны
Делегат — это по сути указатель на функцию. Поскольку указатель может ссылаться на данные разных типов, нужно объявить его тип, чтобы компилятор "знал" на данные какого типа ссылается указатель и мог при компиляции обнаружить возможные ошибки. Поскольку делегат это указатель на функцию, а функция может принимать параметры и возвращать значение, то в объявлении типа делегата указывается тип возвращаемого значения и типы формальных параметров передаваемых функции. В общем случае объявление делегата выглядит так:
[спецификатор доступа] delegate {тип возвращаемого функцией значения} {имя типа делегата}([список формальных параметров функции]);
где {} — обязательные параметры, [] — необязательные
В данном случае конструкция private delegate RV Function<RV, A>(A a); обьявляет тип:
со спецификатором доступа — private
возвращаемым типом — RV
именем типа делегата — Function
и одним формальным параметром a типа A.
Конструкция <RV, A> говорит о том, что этот тип является generic'ом.
Соответственно такой делегат может ссылаться на функции которые полностью соответствуют указанному описанию.
Например "без ущерба для здоровья" можно объявить тот-же самый делегат и так:
private delegate ReturnType Function<ReturnType, ParameterType>(ParameterType a)
Ну вот, тип мы объявили теперь надо определить саму переменную. Вот она и определяется дальше:
Function<string, IAsyncResult> endHandler = delegate {.....}
Эта переменная имеет имя endHandler, тип Function<string, IAsyncResult>(т.е. тип нашего делегата). Кроме того здесь применяется инициализация с использованием анонимного метода delegate {.....}. В фигурных скобках указывается исполняемый код, которому передается один параметр a типа A, т.е. он будет доступен в коде, и этот код возвращает значение типа RV.
Вообще эту тему не так-то просто раскрыть, читайте по порядку про:
1) Делегаты;
2) Анонимные методы(ссылка выше — Нововведения в C# 2.0);
3) Generic'и(ссылка выше — Обобщения);
Кроме того, нужно ознакомиться с:
4) Приведение типов, Boxing/Unboxing(в Google);
5) Изменяемые и не изменяемые типы(mutable/immutable types -> в Google)
Ну как-то так...