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#方法的默认选择应该是函数.
然而,这两种方法都有利有弊,所以我已经制作了一份清单.这两种方法都有任何优点或缺点吗?
传统方法的优点.
"委托类型字段"方法的优点.
请不要投票结束,那已经发生了,并重新开放.这是一个有效的问题,即使你不认为代表方法有很多实际用途,因为它与既定的编码风格有冲突,或者你不喜欢代表的优点.
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,则调用某个原型实例上的方法,依此类推.
方法的主要缺点是代理字段类型方法,当然,重载不再有效.字段名称必须是唯一的; 方法在签名中必须是唯一的.此外,您没有像我们获得泛型方法那样获得通用字段,因此方法类型推断停止工作.