命名空间中的函数?

3

可能是重复问题:
为什么C#不允许非成员函数,就像C++那样

我希望能够直接写Function(),而不是StaticClass.Function()。有许多函数,所有这些函数应该可以从不同(并且无关)的类和文件中访问。如何将这些函数放在特定的命名空间中?仅仅在那里声明会导致编译错误。

error CS1518: Expected class, delegate, enum, interface, or struct

我知道其他.NET语言可以做到这一点。是否有编译选项可供我使用?甚至可能是未记录的选项?

据我所知,没有办法定义一个“全局”方法,但是你可以在类本身内部编写Function()。虽然没有必要这样做。 - Daniel
1
顺便说一下,你不想这么做。它们可以从不同的类中访问,你只需要指明是哪个类即可。 - John Saunders
1
@JohnSaunders 我真的很想这样做。所有的函数都整齐地放在一个命名空间中,如果我包含该命名空间,我想访问它们。我无法想象为什么C#会允许使用goto而不是这个。真的... - user34537
“呃,文章说不值得实现。我想这就回答了我的问题。谢谢@EdS。” - user34537
3个回答

10

C#不允许自由函数,每个函数必须位于一个类型中。这只是它的工作方式,不是技术可行性问题,而是设计决策。

您可能会对此文章感兴趣。


顺带一提,写C#时,注意到Intellisense比写C++时更好用吗?这是其中之一(不是唯一的),可以帮助您更快地编写代码。

编辑:有趣的是,在阅读链接的文章时,我注意到这是一个重复的问题...


顺便提一下,VS2012有很多C++编辑器/IntelliSense的改进。 :) - Chris Sinclair
@ChrisSinclair:是的,它确实有。实际上,即使是2010年,在C++智能感知方面也是一个巨大的进步(在性能方面则是一个巨大的倒退,但这不是重点...)。2005年的C++智能感知简直是个笑话,从未使用过2008年版。所以,是的,它正在变得更好,但对于像C#这样的语言来说,实现起来要容易得多。 - Ed S.

3
C#不允许这样做,这是“按设计要求”的。然而,如果你的目标仅仅是减少输入量,你有一些选择。首先,你可以使用“using指令”来简化这个过程。通过添加以下内容:
using SC = YourNamespace.StaticClass;

你可以将该特定文档内的通话缩短为:
SC.Function();

另一个偶尔适用的选项是使用扩展方法。这可以消除指定类型的需要,因为该函数看起来是第一个参数的成员函数。当然,这不适用于提供的示例(因为它需要参数),但根据具体用例,这有可能是减少输入和搜索量的另一个选择。

-2

C# 是一种纯面向对象的语言,这意味着你不能在类外部拥有函数或声明。你必须使用 static 来实现你想要的功能。


1
-1 OO并不要求所有函数都属于一个类。实际上,它甚至不要求“类”存在。类只是实现面向对象编程的一种方式(当然需要某种数据结构)。此外,Eric Lipper在解释这个决定时完全没有提到这一点。(他确实提到了“C#是一种组件导向的语言”) - Ed S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接