我看到的唯一区别是你不能使用“using staticClass”声明。所以我想知道:
(1)静态类和命名空间之间是否存在真正的区别?
(2)每次调用成员函数时是否有可能避免重写类名?我正在考虑类似于“使用staticClass”的东西。
答案 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)
静态类仍然是一个类。它可以包含方法,属性等。命名空间只是一个命名空间。它只是帮助区分具有相同名称的类声明。
函数不能单独存在于命名空间中,它属于一个类。
如果您需要静态函数而不提及类的名称,那么扩展可能就是您正在寻找的。 p>
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运行时完全理解和管理静态类。它们是完全成熟的类型,您可以使用它们进行反射。