Вместо того, чтобы пытаться написать подпись делегата, которая обрабатывает все интересующие меня случаи, и, возможно, ограничить будущую гибкость (хотя это действительно зависит от случая ..), я иногда использую Action (делегат, подпись которого не принимает никаких параметров) вместо написания моего собственного делегата:
void SomeFunction(Action action)
{
// ...
action();
}
В C # есть функция (и я вполне уверен в VB), которая позволяет вам включать значения из локальной области видимости, а не передавать их в качестве параметров,Это называется анонимным делегатом.В общих чертах CS, взятие с собой локальных значений, а не передача их в качестве параметра, является одной из форм так называемого замыкания.
int someValueFromLocalScope = 5;
SomeFunction(() => DoSomethingElse(someValueFromLocalScope));
// you can also assign a closure to a local variable:
int someValueFromLocalScope = 5;
Action doSomethingElse =
delegate()
{
DoSomethingElse(someValueFromLocalScope);
}; // Or you could use () => { } syntax...
SomeFunction(doSomethingElse);
Тогда SomeFunction не нужно знать, какие параметры применяютсяк конкретному действию.
Подробнее о действии: (ответ касается замыканий, но это также может быть полезно)
Действие - это просто делегат, который принимает нольпараметров и возвращает нулевые значения: http://msdn.microsoft.com/en-us/library/system.action.aspx
Как и любой другой делегат, вы также можете использовать Action в качестве переменной-члена.
Существует больше предварительно разработанных делегатов:
Action<TFirstParameter>
Func<TReturnValue>
Func<TFirstParameter, TReturnValue>
и т. Д.