首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >动作委托在C#中的用法

动作委托在C#中的用法
EN

Stack Overflow用户
提问于 2008-12-16 11:38:42
回答 8查看 122.7K关注 0票数 134

我在C#中与Action Delegate一起工作,希望了解更多关于它们的知识,并思考它们在哪里可能有用。

有人使用过Action Delegate吗?如果有,为什么?或者你能举一些可能有用的例子吗?

EN

回答 8

Stack Overflow用户

发布于 2008-12-16 13:33:40

下面是一个小示例,展示了Action委托的用处

代码语言:javascript
复制
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表达式来简化一下:

代码语言:javascript
复制
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();
    }
}
票数 116
EN

Stack Overflow用户

发布于 2008-12-16 11:53:33

你可以做的一件事是如果你有一个开关:

代码语言:javascript
复制
switch(SomeEnum)
{
  case SomeEnum.One:
      DoThings(someUser);
      break;
  case SomeEnum.Two:
      DoSomethingElse(someUser);
      break;
}

有了强大的行动能力,你可以把这个开关变成一本字典:

代码语言:javascript
复制
Dictionary<SomeEnum, Action<User>> methodList = 
    new Dictionary<SomeEnum, Action<User>>()

methodList.Add(SomeEnum.One, DoSomething);
methodList.Add(SomeEnum.Two, DoSomethingElse); 

..。

代码语言:javascript
复制
methodList[SomeEnum](someUser);

或者你可以走得更远:

代码语言:javascript
复制
SomeOtherMethod(Action<User> someMethodToUse, User someUser)
{
    someMethodToUse(someUser);
}  

……

代码语言:javascript
复制
var neededMethod = methodList[SomeEnum];
SomeOtherMethod(neededMethod, someUser);

只有几个例子。当然,更明显的用法是Linq扩展方法。

票数 69
EN

Stack Overflow用户

发布于 2008-12-16 12:07:48

您可以对短事件处理程序使用操作:

代码语言:javascript
复制
btnSubmit.Click += (sender, e) => MessageBox.Show("You clicked save!");
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/371054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档