C#不允许编写非成员函数,每个方法都应该是类的一部分.我认为这是对所有CLI语言的限制.但我错了,我发现C++/CLI支持非成员函数.编译时,编译器会使该方法成为某个未命名类的成员.

下面是C++/CLI标准所说的,

[注意:CLI将非成员函数视为某些未命名类的成员;但是,在C++/CLI源代码中,此类函数不能用该类名显式限定.结束注意]

未指定元数据中非成员函数的编码.[注:这不会导致互操作问题,因为此类功能无法公开.结束注]

所以我的问题是,为什么C#不实现这样的东西呢?或者您是否认为不应该有非成员函数,每个方法都应该属于某个类?

我的观点是支持非成员函数,这有助于避免污染类的接口.

有什么 idea 吗..?

推荐答案

请参阅以下博客帖子:

http://blogs.msdn.com/ericlippert/archive/2009/06/22/why-doesn-t-c-implement-top-level-methods.aspx

(.)

有人问我:"为什么C#不实现功能X?"总是答案总是一样的:因为从来没有人设计、指定、实现、测试、记录和发布过该功能.所有这六件事都是实现功能所必需的.所有这些都花费了大量的时间、精力和金钱.功能并不便宜,考虑到我们有限的时间、精力和资金预算,我们努力确保我们只提供那些为用户带来最大可能好处的功能.

据我所知,这样一个笼统的回答可能无法解决具体问题.

在这种特殊情况下,明显的用户yield 在过go 还不够大,不足以证明随之而来的语言复杂性是合理的.通过限制不同语言实体之间的嵌套方式,我们(1)将合法程序限制为一种通用的、易于理解的样式,(2)使定义可理解、可指定、可实现、可测试和可记录的"标识符查找"规则成为可能.

通过限制方法体始终位于 struct 或类内部,我们可以更容易地对调用上下文中使用的非限定标识符的含义进行推理;此类对象始终是当前类型(或基类型)的可调用成员.

(.)

还有这篇后续帖子:

http://blogs.msdn.com/ericlippert/archive/2009/06/24/it-already-is-a-scripting-language.aspx

(.)

就像所有的设计决策一样,当我们面对一些竞争的、引人注目的、有价值的和不可妥协的 idea 时,我们必须找到一个可行的折衷方案.我们不这样做,除非是considering all the possibilites,这就是我们在这种情况下所做的.

(emphasis from original text)

.net相关问答推荐

DotNet COM初始化问题

如果只有一个 : 存在于字符串中,则提取冒号后的内容

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

在 C# 中输入按键

将毫秒转换为人类可读的时间间隔

整个命名空间的SuppressMessage

在一个 LINQ 查询中获取两列的总和

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

托管和非托管代码、内存和大小有什么区别?

运算符重载 ==, !=, Equals

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

String.Split 仅在 C# 中的第一个分隔符上?

如何对 LINQ to XML 中的元素进行深层复制?

如何使用 Entity Framework Code First CTP 5 存储图像?

C# (.NET) 设计缺陷

泛型类的默认构造函数的语法是什么?

ADO.NET Entity Framework:更新向导不会添加表

如何判断uri字符串是否有效

在 C# 中转义无效的 XML 字符

为 webClient.DownloadFile() 设置超时