【发布时间】:2011-12-23 02:31:49
【问题描述】:
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 是一个委托。但是,在这种情况下,代表可以扮演类似的角色。
由于先例和语言的设计,C# 方法的默认选择应该是函数。
不过,这两种方法各有利弊,所以我制作了一份清单。这两种方法还有更多的优点或缺点吗?
传统方法的优势。
- 更传统的
- 函数的外部用户请参阅命名参数 - 对于 add_2 语法 arg_n 和类型通常没有足够的信息。
- 与 intellisense 配合使用效果更好 - ty Minitech
- 使用反射 - ty Minitech
- 使用继承 - ty Eric Lippert
- 有一个“this” - ty CodeInChaos
- 更低的开销、速度和内存 - ty Minitech 和 CodeInChaos
- 在更改和使用功能方面无需考虑公共\私有。 - ty CodeInChaos
- 较少动态,允许较少在编译时未知 - ty CodeInChaos
“委托类型字段”方法的优点。
- 更加一致,不是成员函数和数据成员,只是数据成员而已。
- 可以在外观和行为上像一个变量。
- 将其存储在容器中效果很好。
- 多个类可以使用同一个函数,就好像每个类都是成员函数一样,这将非常通用、简洁并且具有良好的代码重用性。
- 直接在任何地方使用,例如作为本地函数。
- 在与垃圾收集一起传递时可能效果很好。
- 更动态,在编译时必须知道的更少,例如,可能存在在运行时配置对象行为的函数。
- 好像封装了它的代码,可以组合和返工,msdn.microsoft.com/en-us/library/ms173175%28v=vs.80%29.aspx
- 函数的外部用户会看到未命名的参数 - 有时这很有帮助,尽管能够命名它们会很好。
- 可以更紧凑,在这个简单的示例中,例如可以删除返回值,如果有一个参数,也可以删除括号。
- 滚动您自己的行为,例如继承 - ty Eric Lippert
- 其他考虑因素,例如功能性、模块化、分布式(代码编写、测试或代码推理)等...
请不要投票关闭,这已经发生了,它已经重新打开。这是一个有效的问题,即使您认为委托方法没有太多实际用途,因为它与既定的编码风格有冲突,或者您不喜欢委托的优势。
【问题讨论】:
-
你知道第二个例子不是函数吗?这是一个代表。
-
如果你想返回 void 那么你使用
Action<>而不是Func<> -
您在哪里看到此选项可供选择?
-
我不明白为什么它被关闭了。关于设计类的实现细节时的竞争因素,这是一个完全合理的问题。 我经常在我自己的程序中使用这种技术,因为它具有真正的优势——也就是说,它让我可以很容易地决定函数中的哪些方法对它们应用了记忆。
-
@EricLippert:我同意这是一个很好且有趣的问题。但它可能不符合 SO 准则。这种性质的问题会导致讨论、主观答案和部分答案,这有利于结束。
标签: c# class function delegates abstraction