Func<>
— это общий делегат — просто его очень удобно использовать, потому что вам не нужно создавать свой собственный делегат для каждой комбинации типа аргумента/возврата.
Раньше вам приходилось писать что-то вроде:
public delegate long MyDelegate( int number );
public void Method( IEnumerable<int> list, MyDelegate myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
Вы должны были опубликовать свой делегат, чтобы пользователь мог правильно вызвать ваш метод. Особенно, когда вам нужна куча разных делегатов, вы в конечном итоге публикуете по одному для каждого списка аргументов и типа возвращаемого значения.
С Func<>
вы просто пишете:
public void Method( IEnumerable<int> list, Func<int, long> myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
Это означает то же самое, что и в первом примере кода — Func<int, long>
определяет делегат, который принимает один целочисленный аргумент и возвращает длинное значение.
Конечно, вы также можете использовать более длинные списки параметров: Func<int, int, bool, long>
по-прежнему будет возвращать значение long, хотя оно принимает два значения ints и bool. Если вам нужен делегат без возвращаемого значения, вам придется использовать Action<>
, который будет иметь тип возвращаемого значения void.
ИЗМЕНИТЬ (по запросу): Как вызвать метод в моем примере:
Для вызывающего нет разницы между решением с MyDelegate
или Func<>
. В обоих случаях у него есть три варианта вызова метода:
Используя лямбда-нотацию (требуется С# 3.0, вероятно, лучшее решение для коротких методов):
Method( myList, i => i * i );
Используя анонимный метод (требуется C# 2.0):
Method( myList, delegate( int i )
{
return i * i;
} );
Или используя реальный метод в качестве аргумента:
Method( myList, Square );
private static long Square( int number )
{
return number * number;
}
person
tanascius
schedule
18.04.2010