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

时间:2010-01-06 14:40:38

标签: c#

我看到的唯一区别是你不能使用“using staticClass”声明。所以我想知道:

(1)静态类和命名空间之间是否存在真正的区别?

(2)每次调用成员函数时是否有可能避免重写类名?我正在考虑类似于“使用staticClass”的东西。

4 个答案:

答案 0 :(得分:31)

是的,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指令以使用扩展方法。

答案 1 :(得分:5)

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

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

如果您需要静态函数而不提及类的名称,那么扩展可能就是您正在寻找的。

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

据我所知,名称空间只是一种语言功能;它们会被编译删除。换句话说,.NET运行时不“看到”命名空间,只是碰巧包含点的类名。例如,String命名空间中的System类被.NET运行时视为名为System.String的类,但根本没有命名空间的概念。

然而,.NET运行时完全理解和管理静态类。它们是完全成熟的类型,您可以使用它们进行反射。