【问题标题】:What is a "static" class?什么是“静态”类?
【发布时间】:2010-10-16 06:06:33
【问题描述】:

在C#中有什么区别:

public static class ClassName {}

还有:

public class ClassName {}

【问题讨论】:

    标签: c# static-classes


    【解决方案1】:
    public static class ClassName {}
    

    静态类就像一个全局变量:您可以在代码中的任何位置使用它而无需实例化它们。 例如:类名。在点运算符之后,您可以使用它的任何属性或函数。

     public class ClassName {}
    

    但是如果你有非静态类,那么你需要创建这个类的一个实例。 例如:

     ClassName classNameObject = new ClassName(); 
    

    【讨论】:

      【解决方案2】:

      静态类不能被实例化,只能包含静态成员。因此,对静态类的调用如下:MyStaticClass.MyMethod(...)MyStaticClass.MyConstant

      一个非静态类可以被实例化并且可以包含非静态成员(实例构造函数、析构函数、索引器)。非静态类的非静态成员只能通过对象调用:

      MyNonStaticClass x = new MyNonStaticClass(...);
      x.MyNonStaticMethod(...);
      

      【讨论】:

      • 编译器在内部标记类抽象和密封,并在IL代码中创建一个私有构造函数。
      • members 是指可以在类中声明/实例化的所有内容和任何内容(即嵌套类、字段、属性、de/constructors、方法)?它们全部必须声明为静态的?
      • @Minh Tran:未实例化,但声明:是的,除了析构函数和索引器 - 它们不能是静态的。对于构造函数,你只能有一个静态 ctor,无参数。嵌套类默认是类的静态成员。
      【解决方案3】:

      c中的静态变量

      类的局部变量作为自动变量 但是静态变量不会因为函数不再活动而消失。它们的值保持不变。如果控制权回来,静态变量具有相同的值

      c 中的静态函数 其他文件中的函数不可见的函数。

      *cpp 中的静态数据成员 * 数据成员可以是cpp中的变量或函数 static 适用于两个数据成员 类本身可以是静态的 “该类中的所有对象共享的静态数据成员只有一个副本” 静态数据成员只能访问静态数据成员

      静态类 这个类不能实例化对象

      【讨论】:

        【解决方案4】:

        首先,对答案的评论询问“静态”是什么意思。在 C# 术语中,“静态”意味着“与类型本身有关,而不是与类型的实例有关”。您使用类型名称而不是引用或值来访问静态成员(来自其他类型)。例如:

        // Static method, so called using type name
        Guid someGuid = Guid.NewGuid();
        // Instance method, called on a value
        string asString = someGuid.ToString();
        

        现在,静态类...

        静态类通常用作“实用程序”类。典型的例子可能是System.Math。创建一个数学实例是没有意义的——它只是“是”。一些规则(“可以”和“不能”):

        • 静态类总是派生自object。您不能指定不同的基类型,也不能让静态类实现接口。
        • 静态类不能有任何实例成员 - 所有变量、方法等都必须是静态的。
        • 静态类不能声明任何实例构造函数,并且编译器不会默认创建无参数构造函数。 (在 C# 2.0 出现静态类之前,人们通常会使用私有构造函数创建抽象类,这会阻止实例化。这里不需要。)
        • 静态类是隐式抽象的(即它们被编译为描述抽象类的 IL),但您不能自己添加 abstract 修饰符。
        • 静态类是隐式密封的(即它们被编译为描述密封类的 IL),但您不能自己添加 sealed 修饰符。
        • 静态类可能是通用的。
        • 静态类可以嵌套在非静态或静态类中。
        • 静态类可能有嵌套类型,非静态或静态。
        • 只有静态的顶级非泛型类可以包含扩展方法 (C# 3.0)。

        【讨论】:

        • "静态类不能声明任何构造函数" 静态 ctor 呢?
        • @Andy:是的,他们可以声明静态构造函数。
        • 好吧,也许关于不声明任何构造函数的声明应该改写,因为听起来静态 ctor 不是现在这样的选项。
        • @Andy:通常情况下,如果有人说“构造函数”,他们隐含的意思是“实例构造函数”。我会编辑,但我真的不认为这很令人困惑。
        【解决方案5】:

        http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html - 非常好的文章。这是针对 Java 的。但我认为 C# 中的概念也应该相同。

        【讨论】:

          【解决方案6】:

          静态类只能包含静态成员。

          可以在不先实例化类的情况下使用静态成员。

          【讨论】:

          • 静态成员和非静态成员有什么区别?也许这就是我所缺少的。
          【解决方案7】:

          静态类和成员用于创建无需创建类实例(使用new关键字,它们不能有构造函数)即可访问的数据和方法。

          静态类可以在不依赖自身对象标识的情况下声明,因此静态类必须只包含静态成员。

          当加载包含该类的程序或命名空间时,CLR 会加载这些类。

          它们也是密封的,不能继承。

          【讨论】:

            【解决方案8】:

            静态类也不能被继承,而具有静态成员的非静态类可以被继承。

            【讨论】:

              【解决方案9】:

              您不能实例化(创建对象)静态类。它只能包含静态成员。

              示例:System.Math

              【讨论】:

                【解决方案10】:

                静态类中的所有方法/属性必须是静态的,而“普通”类可以包含实例和静态方法的混合。

                【讨论】:

                  猜你喜欢
                  • 2010-09-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-08-13
                  • 2010-10-25
                  • 2014-12-27
                  • 2023-03-28
                  • 1970-01-01
                  相关资源
                  最近更新 更多