委托会员超过经典功能有哪些优点或缺点?

ala*_*ere 14 c# delegates abstraction class function

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;}
}
Run Code Online (Sandbox Code Playgroud)

add_1是一个函数,而add_2是一个委托.然而,在这种情况下,代表们可以填补类似的角色.

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

然而,这两种方法都有利有弊,所以我已经制作了一份清单.这两种方法都有任何优点或缺点吗?

传统方法的优点.

  • 更常规
  • 函数的外部用户看到命名参数 - 对于add_2语法arg_n和类型一般不够信息.
  • 使用intellisense-ty Minitech可以更好地工作
  • 适用于反射 - ty Minitech
  • 与继承合作 - Eric Lippert
  • 有一个"这个" - ty CodeInChaos
  • 更低的开销,速度和内存 - ty Minitech和CodeInChaos
  • 在更改和使用函数方面,不需要考虑public\private. - ty CodeInChaos
  • 动态性较低,允许在编译时不知道的少 - ty CodeInChaos

"委托类型字段"方法的优点.

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

请不要投票结束,那已经发生了,并重新开放.这是一个有效的问题,即使你不认为代表方法有很多实际用途,因为它与既定的编码风格有冲突,或者你不喜欢代表的优点.

Eri*_*ert 18

首先,关于这个设计决定,我的"高阶位"将是我永远不会用公共领域/方法做这种事情.至少我会使用一个属性,甚至可能不是.

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

class C
{
    private Func<int, int> ActualFunction = (int y)=>{ ... };
    private Func<int, int> Function = ActualFunction.Memoize();
Run Code Online (Sandbox Code Playgroud)

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

"方法是委托类型"策略的另一个优点是,您可以实现与我们"融入"语言不同的代码共享技术.委托类型的受保护字段本质上是一种虚方法,但更灵活.派生类可以用他们想要的任何东西替换它,并且你已经模拟了一个常规的虚拟方法.但是你可以构建自定义继承机制; 例如,如果你真的喜欢原型继承,你可以有一个约定,即如果字段为null,则调用某个原型实例上的方法,依此类推.

方法的主要缺点是代理字段类型方法,当然,重载不再有效.字段名称必须是唯一的; 方法在签名中必须是唯一的.此外,您没有像我们获得泛型方法那样获得通用字段,因此方法类型推断停止工作.