【问题标题】:What is the use of the static modifier in object-oriented programming?面向对象编程中static修饰符有什么用?
【发布时间】:2011-08-13 18:56:24
【问题描述】:

在我的一次采访中,有人问我static 修饰符的含义。我的回答是告诉面试官不能创建静态类的对象和其他有用的点。

但是面试官问创建这样一个不能创建对象的类有什么用。基本上,他们问为什么首先需要static

我不确定如何回答这个问题。我应该说什么?

【问题讨论】:

  • 我会说OO编程中没有“静态”这样的东西。一些也支持 OO 的语言也支持静态。我可能不会得到这份工作。

标签: c# oop design-patterns static static-methods


【解决方案1】:

参见http://msdn.microsoft.com/en-us/library/79b3xss3%28v=vs.80%29.aspx - 它解释了静态类的优点。

使用静态类的优点是编译器可以检查以确保没有意外添加任何实例成员。编译器将保证不能创建此类的实例。

【讨论】:

  • 不完全正确。 static 可以应用于 C# 中的类。我不知道细节,但大概这与静态成员类比起作用,因为静态类是每件事一次,可能是每个 AppDomain。
  • 您也可以将课程标记为static。然后就不能创建它的实例了。
【解决方案2】:

Static classes 在对外部数据进行操作并且不需要设置或检索其中的任何字段时很有用。

【讨论】:

  • 而扩展方法只能在静态类中定义。
  • 静态字段可以用在非静态类中。
【解决方案3】:

静态不仅仅适用于类,成员也可以是静态的。使用静态的原因是为了提供实用类型的功能,而实例化一个对象来使用它是没有意义的。例如。为什么要创建一个 int 以使用 int.Parse()

【讨论】:

    【解决方案4】:

    面试官可能希望你讨论面向对象的设计和模式,而不是他们希望你背诵特定修饰符的定义。这里真的没有正确的答案。纯粹主义者可能会争辩说static 是可憎的。实用主义者可能会争辩说,它填补了“一切都是对象”抽象中的一个空白,允许您调用实用方法,而实例化一个新对象只是为了调用它们是没有意义的。这方面的典型例子是System.Math class

    大多数程序员遵循的一般经验法则是,如果您正在操作的数据不与对象的任何特定实例相关联,那么将该字段/方法标记为静态可能是有意义的。否则,它可能应该是对象实例的常规成员。

    MSDN documentation 已经有了很好的解释:

    使用static 修饰符声明一个静态成员,该成员属于类型本身而不是特定对象。 static 修饰符可以与类、字段、方法、属性、运算符、事件和构造函数一起使用,但不能与索引器、析构函数或类以外的类型一起使用。如需更多信息,请参阅Static Classes and Static Class Members (C# Programming Guide)

    static修饰符在C#中还有更具体的用途,比如定义扩展方法(只能在静态类内部定义)、定义互操作方法等。另外值得注意的是,所有的静态类都是@ C#中的987654328@,因为没有构造函数,它们不能被继承。

    【讨论】:

      【解决方案5】:

      您可以查看关于对象/类的状态的“静态”。

      1. 当您有一个类不需要为单个对象维护状态信息,而是为该类维护状态信息时,使用“静态”。示例是静态变量。
      2. 另一件事是将类本身声明为静态,而在对象中无法实例化,您可以调用不需要自己的状态信息的静态方法。

      其他人已经给出了一些有用的例子,我不再重复。

      【讨论】:

        【解决方案6】:

        static修饰符意味着类的成员属于类本身而不是类的实例。

        即使创建了许多类实例,静态成员也无法在应用程序中复制。

        查看以下链接了解更多信息Static Modifiers

        请参阅以下使用静态成员的示例类:

        class myClass
        {
            static int x = 5;
            static string name = "Ashraf";
        
            public int X 
            {
                get {return x;}
                set {x = value;}
            }
        
            public string name 
            {
                get {return name;}
                set {name = value;}
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2011-01-26
          • 1970-01-01
          • 2015-11-08
          • 2011-06-29
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多