首页 > C# > 我们什么时候需要代表?Func vs. Action vs. Predicate

我们什么时候需要代表?Func vs. Action vs. Predicate

上一篇 下一篇

代表:谓词 vs. 动作 vs. 函数

有了真实的例子和它们的使用,有人可以帮助我理解:

  1. 我们什么时候需要代表?Func<T, ..>
  2. 我们什么时候需要代表?Action<T>
  3. 我们什么时候需要代表?Predicate<T>

分割线

网友回答:

Func – 当您想要一个函数的委托时,该函数可能会也可能不会接受参数并返回值。最常见的示例是从 LINQ 中选择:

var result = someCollection.Select( x => new { x.Name, x.Address });

操作 – 当您需要函数的委托时,该函数可能会也可能不会接受参数并且不返回值。我经常将这些用于匿名事件处理程序:

button1.Click += (sender, e) => { /* Do Some Work */ }

谓词 – 当您需要 Func 的专用版本时,该版本根据一组条件评估值并返回布尔结果(对于匹配为 true,否则为 false)。同样,这些在 LINQ 中经常用于诸如 Where:

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

 

我只是仔细检查了一下,结果发现 LINQ 不使用谓词。不知道他们为什么做出这个决定…但从理论上讲,这仍然是一个适合谓词的情况。

分割线

网友回答:

和之间的区别只是您希望委托返回值(使用 )还是不返回值(使用 )。FuncActionFuncAction

Func可能最常用于 LINQ 中,例如在投影中:

 list.Select(x => x.SomeProperty)

或过滤:

 list.Where(x => x.SomeValue == someOtherValue)

或按键选择:

 list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)

Action更常用于以下情况:对列表中的每个项目执行给定的操作。我使用它的频率低于 ,尽管我有时会将无参数版本用于 和 之类的事情。List<T>.ForEachFuncControl.BeginInvokeDispatcher.BeginInvoke

Predicate真的只是一个特例,在所有代表和大多数代表都来之前介绍。我怀疑,如果我们已经拥有并以各种伪装,就不会被引入……尽管它确实赋予了代表的使用某种含义,而 和 用于各种不同的目的。Func<T, bool>FuncActionFuncActionPredicateFuncAction

Predicate主要用于 和 等方法。List<T>FindAllRemoveAll

分割线

网友回答:

Action 是指向方法的委托(指针),该方法采用零个、一个或多个输入参数,但不返回任何内容。

Func 是指向方法的委托(指针),该方法采用零个、一个或多个输入参数,并返回一个值(或引用)。

谓词是一种特殊的 Func,通常用于比较(采用泛型参数并返回布尔值)。

虽然 Action 和 Func 广泛用于 Linq,但它们在逻辑上独立于 Linq 的概念。C++已经以类型化函数指针的形式包含了基本概念。

下面是一个不使用 Linq 的 Action 和 Func 的小示例:

class Program
{
    static void Main(string[] args)
    {
        Action<int> myAction = new Action<int>(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(123);

        Func<int, double> myFunc = new Func<int, double>(CalculateSomething);
        Console.WriteLine(myFunc(5));   // Prints out "2.5"
    }

    static void DoSomething(int i)
    {
        Console.WriteLine(i);
    }

    static double CalculateSomething(int i)
    {
        return (double)i/2;
    }
}

模板简介:该模板名称为【我们什么时候需要代表?Func vs. Action vs. Predicate】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 299次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-03
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
响应式 微信文章 微信模板 微信图片 html5 企业网站 微信素材 微信公众平台 自适应 单页式简历模板
您可能会喜欢的其他模板