Вы спрашиваете, почему они существуют или почему они определены как делегаты?
Что касается того, почему они существуют, возможно, лучшая причина - удобство.Если вам нужен делегат, который не возвращает значения и принимает единственный параметр какого-либо типа, вы можете определить его самостоятельно:
public delegate void MyDelegate(int size);
А затем создать его:
MyDelegate proc = new MyDelegate((s) => { // do stuff here });
Конечно, вам придется делать это для каждого другого типа, который вы хотите иметь такой метод.
Или, вы можете просто использовать Action<T>
:
Action<int> proc = new Action<int>((s) => { /* do stuff here */ });
КонечноВы можете сократить это до:
Action<int> proc = (s) => { /* do stuff here */ });
Что касается "почему они являются делегатами?"Потому что так обрабатываются ссылки на функции в .NET: мы используем делегаты.Обратите внимание на сходство в приведенных выше примерах.То есть MyDelegate
концептуально то же самое, что и Action<int>
.Они не точно одно и то же, поскольку они имеют разные типы, но вы можете легко заменить каждый экземпляр этого MyDelegate
в программе на Action<int>
, и программа будет работать.