Nav*_*K N 65 .net c# clr c++-cli function
C#将不允许编写非成员函数,并且每个方法都应该是类的一部分.我认为这是所有CLI语言的限制.但我错了,我发现C++/CLI支持非成员函数.编译时,编译器会将该方法作为某个未命名类的成员.
这是C++/CLI标准所说的,
[注意:CLI将非成员函数视为某些未命名类的成员; 但是,在C++/CLI源代码中,此类函数无法使用该类名显式限定.结束说明]
未指定元数据中非成员函数的编码.[注意:这不会导致互操作问题,因为此类功能无法获得公共可见性.结束说明]
所以我的问题是为什么C#不实现这样的东西?或者你认为不应该有非成员函数,每个方法应该属于某个类?
我的意见是拥有非成员函数支持,它有助于避免污染类的接口.
有什么想法吗..?
Eri*_*ert 86
看到这篇博文:
http://blogs.msdn.com/ericlippert/archive/2009/06/22/why-doesn-tc-implement-top-level-methods.aspx
(......)
我被问到"为什么C#不实现功能X?" 每时每刻.答案总是一样的:因为没有人设计,指定,实施,测试,记录和发送该功能.所有这六件事都是实现这一功能所必需的.所有这些都耗费了大量的时间,精力和金钱.功能并不便宜,我们非常努力地确保我们只提供那些能够为我们的用户提供最佳利益的功能,因为我们的时间,精力和预算都有限.
我理解这样的一般性答案可能并不能解决具体问题.
在这种特殊情况下,明显的用户利益在过去并不足以证明随之而来的语言的复杂性.通过严格区分不同的语言实体如何嵌套在一起,我们(1)将法律程序限制在一个易于理解的共同风格中,(2)使定义"标识符查找"规则成为可能,这些规则是可理解的,可指定的,可实现的,可测试的并且可记录.
通过将方法体限制为始终位于结构或类中,我们可以更容易地推断出在调用上下文中使用的非限定标识符的含义; 这样的东西总是当前类型(或基类型)的可调用成员.
(......)
这个后续发布:
http://blogs.msdn.com/ericlippert/archive/2009/06/24/it-already-is-a-scripting-language.aspx
(......)
像所有的设计决策一样,当我们遇到许多竞争,引人注目,有价值和不可能的想法时,我们必须找到一个可行的妥协方案.除非考虑所有可能性,否则我们不这样做,这就是我们在这种情况下所做的事情.
(重点来自原文)
jal*_*alf 39
C#不允许它,因为Java不允许它.
我可以想到为什么Java的设计者可能不允许它的几个原因
正如我在评论中已经说过的那样,我认为这是一个很好的问题,并且在很多情况下,非成员函数会更受欢迎.(这部分主要是对所有其他答案的回答,说"你不需要它")
在C++中,允许使用非成员函数,它们通常是首选,原因如下:
std::findstd :: sort`定义为非成员函数,以便它们可以在任何类型的序列上重用,无论是数组,集合,链表还是(对于std :: find,at最少)流.代码重用也是OOP的重要组成部分.find函数不需要知道LinkedList类,以便能够处理它.如果它已被定义为成员函数,它将是LinkedList类的成员,基本上将这两个概念合并为一个大blob.具有非成员函数的能力可能起源于C(你别无选择),但在现代C++中,它本身就是一个至关重要的特性,不仅仅是为了向后兼容,而是因为它更简单它允许更清洁,更可重复使用的代码.
实际上,C#似乎已经实现了很多相同的东西,很久以后.您为什么认为添加了扩展方法?它们是实现上述目标的尝试,同时保留了简单的类似Java的语法.Lambdas也是有趣的例子,因为它们本质上是自由定义的小函数,而不是任何特定类的成员.所以是的,非成员函数的概念是有用的,C#的设计者也意识到了同样的事情.他们只是试图通过后门偷偷摸摸这个概念.
http://www.ddj.com/cpp/184401197和http://www.gotw.ca/publications/mill02.htm是由C++专家撰写的关于该主题的两篇文章.
Nem*_*vic 12
非成员函数是一件好事,因为它们可以改善封装并减少类型之间的耦合.大多数现代编程语言(如Haskell和F#)都支持免费功能.
不将每个方法放在命名类中有什么好处?为什么非成员函数会"污染"类的接口?如果您不希望它作为类的公共API的一部分,请不要将其公开或不将其放在该类中.您始终可以创建不同的类.
我不记得曾经想要编写一个没有适当范围的方法 - 当然除了匿名函数之外(实际上并不相同).
简而言之,我看不到非成员函数的任何好处,但我可以看到将所有方法放在适当命名的类中的一致性,命名和文档方面的好处.