class my_class
{
    public int add_1(int a, int b) {return a + b;}
    public func<int, int, int> add_2 = (a, b) => {return a + b;}
}

add_1是一个函数,而add_2是一个委托(delegate)。但是,在这种情况下,代表可以扮演类似的角色。

由于先例和语言的设计,C#方法的默认选择应该是函数。

但是,两种方法都各有利弊,因此我列出了 list 。这两种方法是否还有其他优点或缺点?

常规方法的优点。
  • 更常规的
  • 函数的外部用户
  • 看到命名的参数-对于add_2语法arg_n和类型通常没有足够的信息。
  • 与intellisense搭配使用效果更好-ty Minitech
  • 与反射配合使用-ty Minitech
  • 可继承-ty Eric Lippert
  • 有一个“this”-ty CodeInChaos
  • 降低了开销,速度和内存-ty Minitech和CodeInChaos
  • 不必在更改和使用函数方面考虑public \ private。 -ty CodeInChaos
  • 动态性较低,允许在编译时未知的较少动态-ty CodeInChaos

  • “委托(delegate)类型字段”方法的优点。
  • 更具一致性,而不是成员函数和数据成员,而仅仅是数据成员。
  • 可以看起来和表现得像变量。
  • 将其存储在容器中效果很好。
  • 多个类可以使用相同的函数,就像它们是每个成员函数一样,这将非常通用,简洁并且具有良好的代码重用性。
  • 易于在任何地方使用,例如作为本地函数。
  • 当与垃圾回收一起传递时,
  • 可能运行良好。
  • 更具动态性,在编译时知道的很少,例如,可能有一些函数在运行时配置对象的行为。
  • 就像封装它的代码一样,可以组合和重做,msdn.microsoft.com/en-us/library/ms173175%28v=vs.80%29.aspx
  • 该函数外部的
  • 会看到未命名的参数-有时这很有用,尽管能够命名它们很不错。
  • 可以更紧凑,例如在此简单示例中,可以删除返回值,如果有一个参数,也可以删除括号。
  • 滚动您自己的行为,例如继承-ty Eric Lippert
  • 其他考虑因素,例如功能,模块化,分布式(代码编写,测试或代码推理)等...

  • 请不要投票关闭,这已经发生,并且重新打开了。即使您认为委托(delegate)方法与已建立的编码风格有冲突,或者您不喜欢委托(delegate)方法有很多实际用途,或者您不喜欢委托(delegate)的优势,这也是一个有效的问题。

    最佳答案

    首先,对我来说,关于这个设计决定的“高阶位”是,我永远不会在公共(public) Realm /方法上做这种事情。至少我会使用一个属性,甚至可能不会使用。

    对于私有(private)字段,我经常使用这种模式,通常是这样的:

    class C
    {
        private Func<int, int> ActualFunction = (int y)=>{ ... };
        private Func<int, int> Function = ActualFunction.Memoize();
    

    现在,我可以非常轻松地测试不同记忆策略的性能特征,而无需完全更改ActualFunction的文本。

    “方法是委托(delegate)人类型的字段”策略的另一个优点是,您可以实现与我们“融入”该语言的技术不同的代码共享技术。委托(delegate)类型的 protected 字段本质上是一种虚拟方法,但更灵活。派生类可以用所需的任何类替换它,并且您已经模拟了常规的虚方法。但是您可以建立自定义继承机制;例如,如果您确实喜欢原型(prototype)继承,则可以约定:如果该字段为null,则改为调用某个原型(prototype)实例上的方法,依此类推。

    委托(delegate)方式的方法的一个主要缺点是,当然,重载不再起作用。字段名称必须唯一;方法仅在签名上必须唯一。另外,您不会像获取通用方法那样获得通用字段,因此方法类型推断会停止工作。

    关于c# - 与经典功能相比,委派成员还有更多优点或缺点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8028059/

    10-09 15:55