Как видите, генерируемый здесь класс BinaryOp определяет три открытых метода. Метод Invoke можно назвать главным, поскольку он используется для
Методы BeginInvoke и EndInvoke обеспечивает возможность
Но откуда компилятор "знает", как определять методы Invoke, BeginInvoke и EndInvoke? Чтобы понять суть процесса, рассмотрим пример автоматически генерируемого типа класса BinаrуОр (полужирным шрифтом здесь обозначены элементы, заданные определяемым типом делегата).
sealed class BinaryOp
public BinaryOp
public void
public IAsyncResult BeginInvoke(int x, int y,
public int
}
Во-первых, обратите внимание на то, что параметры и возвращаемое значение определяемого здесь метода Invoke соответствуют определению делегата BinaryOp. Первые параметры членов BeginInvoke (в данном случае это два целых числа) тоже соответствуют определению делегата BinaryOp, однако BeginInvoke всегда имеет еще два параметра (типа AsyncCallback и object), которые используются для асинхронного вызова методов. Наконец, возвращаемое значение метода EndInvoke тоже соответствует исходной декларации делегата, а единственным параметром метода является объект, реализующий интерфейс IAsyncResult.
Рассмотрим еще один пример. Предположим, что мы определили тип делегата, который позволяет указать на любой метод, возвращающий строку и имеющий три входных параметра System.Boolean.
public delegate string MyDelegate(bool a, bool b, bool c);
На этот раз автоматически генерируемый класс выглядит так.
sealed class MyDelegate
public MyDelegate
public string
public IAsyncResult BeginInvoke(bool a, bool b, bool c,
public string
}
Делегаты могут также "указывать" на методы, содержащие любое число параметров out или ref. В качестве примера рассмотрим следующий тип делегата.
public delegate string MyOtherDelegate(out
Сигнатуры методов Invoke и BeginInvoke выглядят так, как и ожидается, но обратите внимание на метод EndInvoke, который теперь включает и все аргументы out/ref, определенные типом делегата.
sealed class MyOtherDelegate
public MyOtherDelegate
public string
public IAsyncResult BeginInvoke(out
public string
}
Итак, в результате определения делегата в C# компилятор генерирует изолированный класс с тремя методами, для которых возвращаемые значения и типы параметров соответствуют декларации делегата. Следующий псевдокод приближенно описывает соответствующий базовый шаблон.
// Это только псевдокод!
public sealed class