在C#中,静态类和命名空间有什么区别?

17

我看到的唯一区别是不能使用 "using staticClass" 声明。

因此,我想知道:

  1. 静态类和命名空间之间是否有真正的区别?
  2. 是否有可能避免每次调用成员函数都要重写类名?我在思考类似于" using staticClass" 的东西。

我看到的唯一差异是无法使用“ using staticClass”声明。因此,我想知道:

  1. 静态类和命名空间之间是否存在实际差异?
  2. 是否有可能避免每次调用成员函数时都必须重写类名?我在思考类似于“ using staticClass”的东西。

4
依据我的看法,每次重写类名实际上是一件好事。而且你其实不需要每次入类名——通常在Visual Studio中,你只需输入第一个字母和点号,就会自动选中该类。 - OregonGhost
1
@OregonGhost:或者,正如Python社区所说:“命名空间是一个非常棒的想法 - 让我们做更多这样的事情!” - balpha
4个回答

35

是的,static类在技术上是一种类型。它可以拥有成员(字段、方法、事件)。命名空间只能保存类型(它本身不被视为“类型”;typeof(System)会导致编译时错误)。

对于静态类,没有直接等效于为命名空间添加using指令的方式。但是,您可以声明别名:

using ShortName = ReallyReallyLongStaticClassName;

并使用

ShortName.Member

在引用其成员时。

此外,您可以使用静态类在其他类型上声明扩展方法,并直接使用它们而不需要显式引用类名:

public static class IntExtensions {
   public static int Square(this int i) { return i * i; }
}

然后像这样使用:

int i = 2;
int iSquared = i.Square(); // note that the class name is not mentioned here.

当然,如果要使用扩展方法的类不是在根或当前命名空间中声明的,则需要添加一个using指令,以包含该类的命名空间。


顺便提一下,类也可以容纳类型。我认为你应该在最后一个例子中提到,你需要using NamespaceContainingTheStaticClass. - R. Martinho Fernandes
马丁诺:是的,一个类可以有嵌套类型,但命名空间也可以。这不是一个对比特征。该类没有在命名空间中声明,因此您不需要 using 它。如果您在根命名空间中声明一个静态类,则其扩展方法会自动被检索(这就是声明类在根命名空间中不是一个好主意的原因之一)。 - Mehrdad Afshari
哦,忘记使用根命名空间了。那太邪恶了,我甚至没有考虑过它。 - R. Martinho Fernandes
Mehrdad,你能解释一下“它的扩展方法会自动被捕捉到”是什么意思吗? - Dimitri C.
我的意思是,如果静态类定义的命名空间是根命名空间或您编写代码以使用扩展方法的命名空间,则不必显式添加using指令。当然,这是相当直观的行为。 - Mehrdad Afshari
请注意,使用C# 6,您现在可以使用using static My.Static.Class;来使用声明的所有成员和类型作为顶级成员。 - Asad Saeeduddin

7

静态类仍然是一个类。它可以包含方法、属性等。命名空间只是一个命名空间。它只是一个帮助区分具有相同名称的类声明的助手。

函数不能单独存在于命名空间中,它属于一个类。

如果您需要一个不需要提及类名称的静态函数,则扩展可能是您要找的。

public static class MathExtensions
{
 public static int Square(this int x)
 {
  return x * x;
 }
}
//...
// var hundredSquare = 100.Square();

6

另一个区别是命名空间可以跨越多个程序集,而类不能。


5
据我所理解,命名空间只是一种语言特性,编译后会被移除。换句话说,.NET运行时并不“看到”命名空间,只看到包含点的类名。例如,在System命名空间中的String类在.NET运行时被视为名为System.String的类,但根本没有命名空间的概念。
然而,静态类完全被.NET运行时理解和管理。它们是完整的类型,您可以在它们上使用反射。

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