我在C#中与Action Delegate一起工作,希望了解更多关于它们的知识,并思考它们在哪里可能有用。
有人使用过Action Delegate吗?如果有,为什么?或者你能举一些可能有用的例子吗?
发布于 2008-12-16 13:33:40
下面是一个小示例,展示了Action委托的用处
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Action<String> print = new Action<String>(Program.Print);
List<String> names = new List<String> { "andrew", "nicole" };
names.ForEach(print);
Console.Read();
}
static void Print(String s)
{
Console.WriteLine(s);
}
}
请注意,foreach方法迭代名称集合并对该集合的每个成员执行print
方法。对于我们C#开发人员来说,这是一个范式的转变,因为我们正在向更多的函数式编程风格发展。(有关它背后的计算机科学的更多信息,请阅读:http://en.wikipedia.org/wiki/Map_(higher-order_function)。
现在,如果你使用的是C# 3,你可以像这样用一个lambda表达式来简化一下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<String> names = new List<String> { "andrew", "nicole" };
names.ForEach(s => Console.WriteLine(s));
Console.Read();
}
}
发布于 2008-12-16 11:53:33
你可以做的一件事是如果你有一个开关:
switch(SomeEnum)
{
case SomeEnum.One:
DoThings(someUser);
break;
case SomeEnum.Two:
DoSomethingElse(someUser);
break;
}
有了强大的行动能力,你可以把这个开关变成一本字典:
Dictionary<SomeEnum, Action<User>> methodList =
new Dictionary<SomeEnum, Action<User>>()
methodList.Add(SomeEnum.One, DoSomething);
methodList.Add(SomeEnum.Two, DoSomethingElse);
..。
methodList[SomeEnum](someUser);
或者你可以走得更远:
SomeOtherMethod(Action<User> someMethodToUse, User someUser)
{
someMethodToUse(someUser);
}
……
var neededMethod = methodList[SomeEnum];
SomeOtherMethod(neededMethod, someUser);
只有几个例子。当然,更明显的用法是Linq扩展方法。
发布于 2008-12-16 12:07:48
您可以对短事件处理程序使用操作:
btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");
https://stackoverflow.com/questions/371054
复制相似问题