【问题标题】:Why can static classes can have only static members?为什么静态类只能有静态成员?
【发布时间】:2023-03-06 15:43:01
【问题描述】:

正如标题所示,我想了解为什么静态类只能有静态成员。我希望它在所有编程语言中都是一样的。所以我相信所有语言的解释都是一样的。

【问题讨论】:

  • 听起来有点功课……你考虑清楚了吗?在静态类中允许非静态成员有什么目的?
  • 我知道规则'静态类不能有非静态成员'。但我想了解原因。实际上,我希望在内存方面有更多令人讨厌的答案,例如静态类及其成员的存储方式以及非静态类和成员的存储方式。 :)

标签: .net oop class static class-design


【解决方案1】:

静态类无法实例化,因此它不会有任何实例,非静态成员需要其类的实例才能访问。由于静态类不能有任何实例,因此您无法访问非静态成员(如果有)。

因此静态类只能有静态成员

【讨论】:

    【解决方案2】:

    这不是一个设计决定,而是一个合乎逻辑的决定。最简单的起点是查看概念的相关定义:

    静态类是无法实例化的。这意味着您不能创建属于该类类型的对象。

    非静态成员与类的特定实例相关联。它们包含与该类类型的一个对象专有关联的数据。

    因此,如果静态类包含非静态成员,您将永远无法访问该数据或调用该方法,因为您永远无法实例化该静态类类型的对象。相反,您必须拥有可以直接从类的静态实例调用的所有 static 成员。

    但是,您可以拥有包含静态成员的非静态类。这样,您可以访问数据或调用作为静态成员公开的方法,而无需实例化该类的对象。但是,您可以实例化该类类型的对象并访问非静态(或实例)成员。例如,如果你有一个类Circle,你可以有像CalculateArea 函数和PI 字段这样的静态成员。这些成员通常适用于所有圈子,只是因为它们是圈子。但是您也可以拥有与该类的特定实例相关联的非静态成员,因为它们描述了特定圆对象。这些可能是字段DiameterCircumference。考虑到存储在特定实例的非静态字段中的数据,您还可以使用非静态函数来计算圆的面积。

    【讨论】:

      【解决方案3】:

      无法实例化静态类。因此,永远无法访问非静态成员。

      如果你想混合和匹配静态成员,不要将类设为静态。

      【讨论】:

        【解决方案4】:

        大概是因为实例方法永远不会被调用。

        【讨论】:

          【解决方案5】:

          如果你把一个非静态成员放在一个静态类中,它就不是一个静态类。 (您不能实例化静态类 - 要拥有非静态成员,您必须能够创建调用这些成员的类的实例 - 这将使其成为常规类)

          换个角度看,通过将类标记为静态,您故意要求编译器不允许您在该类中放置非静态方法 - 这是您做出的设计决定,而编译器帮助检查您是否遵循自己的设计。

          【讨论】:

            【解决方案6】:

            我不确定这是否相关,但(至少在 c# .net 4.0 中)静态类可以包含包含非静态成员的非静态类定义。因此,您似乎可以将非静态成员添加到静态类,因为嵌套类型被视为 member

            例子:

            public static class MyClass
            {
                /// <summary>
                ///  This non-static class is accessible and able to be instantiated through the 
                ///  static class MyClass.
                /// </summary>
                public class Type1
                {
                    public String prop1 { get; set; }
                    public String funct1(String result)
                    {
                        return result;
                    }
                }
            
                /// <summary>
                /// This function is inaccessible since it requires an instance of MyClass.
                /// It will also cause a compile error.
                /// </summary>
                /// <returns></returns>
                public String nonStaticFunc()
                {
                    return "aString";
                }
            
                /// <summary>
                /// This function is accessible through the MyClass type because it is also static
                /// and therefore does not require a class instance.
                /// </summary>
                /// <returns></returns>
                public static String staticFunc(String str)
                {
                    return str;
                }
            }
            

            如您所见,静态类 MyClass 有一个非静态类定义 Type1,必须实例化才能使用。而 MyClass 中的静态函数 staticFunc 不需要访问实例。

            //Valid operations
            
            String result = MyClass.staticFunc("result"); //No class instance.
            
            MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
            someObj.prop1 = someObj.funct1("hi");
            

            【讨论】:

              猜你喜欢
              • 2011-01-18
              • 1970-01-01
              • 2015-08-15
              • 2011-11-10
              • 1970-01-01
              • 2012-04-13
              • 1970-01-01
              • 1970-01-01
              • 2022-08-06
              相关资源
              最近更新 更多