静态类和命名空间之间有什么区别?(用C#表示)

静态类和命名空间之间有什么区别?(用C#表示),c#,C#,我看到的唯一区别是不能使用“using staticClass”声明 因此,我想知道: 静态类和命名空间之间真的有区别吗 是否有可能避免每次调用成员函数时都必须重写类名?我在考虑类似于“使用staticClass”的东西 是的,静态类在技术上是一种类型。它可以有成员(字段、方法、事件)。命名空间只能保存类型(而且它本身不被视为“类型”;typeof(System)是编译时错误) 对于静态类的名称空间,没有直接等效于使用指令添加。但是,您可以声明别名: using ShortName = Real

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

因此,我想知道:

  • 静态类和命名空间之间真的有区别吗
  • 是否有可能避免每次调用成员函数时都必须重写类名?我在考虑类似于“使用staticClass”的东西

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

    对于静态类的名称空间,没有直接等效于使用指令添加
    。但是,您可以声明别名:

    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
    指令才能使用扩展方法。

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

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

    如果您需要一个静态函数而不提及类的名称,那么扩展可能就是您想要的

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

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

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


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

    在我看来,每次重写类名实际上是一件好事。你不必每次都输入名称——通常在Visual Studio中,你会输入第一个字母,然后是点,类仍然处于选中状态。@OregonGhost:或者,正如Python的人所说:“名称空间是一个非常好的主意——让我们做更多的事情吧!”顺便说一句,类也可以包含类型。我认为您应该在上一个示例中提到,您需要使用名称空间containingthestaticclass
    。Martinho:是的,类可以有嵌套类型,但名称空间也可以。这不是一个对比鲜明的特征。该类未在命名空间中声明,因此不需要使用它。如果在根命名空间中声明一个静态类,它的扩展方法会被自动拾取(这也是在根命名空间中声明类不是一个好主意的原因之一)。哦,忘记使用根命名空间了。Mehrdad,你能解释一下“它的扩展方法是否被自动拾取”是什么意思?我的意思是,如果静态类定义的命名空间是根命名空间或者你编写代码的命名空间使用扩展方法,那么你不必显式地添加一个使用指令。当然,这是相当直观的行为。