【问题标题】:What is the difference between a static class and a normal class?静态类和普通类有什么区别?
【发布时间】:2011-02-25 03:06:40
【问题描述】:

什么时候我应该更喜欢静态类或普通类?或者:它们之间有什么区别?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace staticmethodlar
{
    class Program
    {
        static void Main(string[] args)
        {
            SinifA.method1();
        }
    }

    static class SinifA 
    {
       public static void method1()
        {
            Console.WriteLine("Deneme1");
        }
    }

    public static class SinifB
    {
        public static void method2()
        {
            Console.WriteLine("Deneme2");
        }
    }
    public class sinifC
    {
       public void method3()
        {
            Console.WriteLine("Deneme3");
        }
    }

    public class sinifD : sinifC
    {
        void method4()
        {
            Console.WriteLine("Deneme4");
        }

        sinifC sinifc = new sinifC();  // I need to use it :)
    }
}

【问题讨论】:

标签: c# .net oop


【解决方案1】:

来自MSDN documentation on static classes

一个类可以声明为静态的,表明它只包含静态成员。不能使用 new 关键字创建静态类的实例。加载包含类的程序或命名空间时,.NET Framework 公共语言运行时 (CLR) 会自动加载静态类。

【讨论】:

  • “学习阅读文档”评论真的有必要吗?当然,我会回答你的问题,但也会向你展示我在智力上的优势@ss。星期五快乐!
  • @WaggingSiberian:让他/她受益匪浅,这是搜索短语 static class C# 的第一个 Google 结果,是的,这是必要的。我不觉得在发布问题之前进行谷歌搜索是不合理的要求。
  • @romanarmy,如果回答对您来说如此简单的问题需要您发布尖刻的 cmets,为什么要浪费您的时间?继续前进,让可以回答问题的人而不是混蛋发布答案。您可以简单地发布 Google 链接,然后放手。有时,这完全取决于您呈现它的方式。
【解决方案2】:

您可以通过类构造函数创建“普通”类的实例。

var normal = new Normal();

您不能创建静态类的实例。它们只能有静态方法。

另外值得注意的是,您必须在静态类中声明 extension methods

【讨论】:

    【解决方案3】:

    可以在不使用类实例的情况下调用静态成员。例如,具有 Area 方法调用的静态 Math 类由 Math.Area 调用,而无需先实例化 Math 类。

    【讨论】:

      【解决方案4】:
      • 静态类不能是instantiatedinherited
      • 静态类在输出 MSIL 中被编译器标记为 sealedabstract
      • 静态类的所有成员也必须是静态的。
      • 只有静态类可以承载extension methods
      • 静态类不能用作泛型类型参数。

      【讨论】:

      • 您能否告诉我更多关于“只有静态类可以承载扩展方法”的信息。为什么普通类不能托管扩展方法?谢谢!
      【解决方案5】:

      简单来说:

      不能使用new 关键字来实例化静态类。 静态类中的所有方法都必须是静态的,可以直接调用,无需实例化。

      “普通”类必须被实例化,但是“普通”类中的任何静态方法都可以在不实例化的情况下调用。

      如果不先实例化包含类,就不能调用“普通”类中的非静态方法。

      【讨论】:

      • 那么具有函数 Method1() 的静态类和具有静态函数 Method1() 的普通类有什么区别。以及我们将使用上述方法的哪种场景..
      【解决方案6】:

      静态类包含不能多次实例化的静态对象。通常我使用静态类是为了容纳提供计算、通用处理模式、字符串输出格式等的静态方法。静态类是轻量级的,不需要实例化。

      例如System.IO.File 是一个静态类,具有静态方法Exists()。您无需创建 File 对象来调用它。你像这样调用它

      System.IO.File.Exists(filePath)

      而不是这样做

      System.IO.File myFile = new System.IO.File(filePath);

      if(myFile.Exists()) { /* do work */ }

      如果您在软件中需要多个对象,那么您可以使用动态类。例如,如果您有一个库存系统,您可能有多个 Product 对象,在这种情况下,您将使用诸如此类的动态类

      public class Product
      {
      
          public int    ProductID   { get; private set; }
          public string ProductName { get; private set; }
          public int    Qty         { get; set; }
      
          public Product( int productID, string productName, int total )
          {
              this.ProductID = productID;
              this.ProductName = productName;
              this.Qty = total;
          }       
      }
      

      【讨论】:

        【解决方案7】:

        静态类是不能被实例化的。因此,它不能像普通类那样用作符合类定义的某个对象的多个实例的“模板”。在普通类中,为类的每个“实例”创建定义的数据成员,并且每个“实例”都有自己的一组这些数据成员,因此这些实例代表单个“实体”或某些对象的复杂内存数据结构(您编写了类来表示)。

        当你定义(编码)一个静态类时,它的所有数据字段也必须是静态的,这意味着它们不能为类的每个实例实例化一次,(你不能创建静态类的实例)。仅当您只需要一个容器来保存不依赖于应用程序管理的某些对象或数据结构的状态的方法时(如添加函数或字符串格式化程序等),静态类才有用。

        【讨论】:

          【解决方案8】:

          普通类是可以实例化并可以与对象一起使用的类。

          静态类是不能实例化且不能扩展的类。

          即默认为a static class is sealed and abstract,你可以看看

          静态类编译器的 MSIL 将密封和抽象放在静态类前面。

          所以,因为不能实例化静态类,所以不能定义实例方法

          在静态类上,所以所有方法都必须是静态的,并且当然是公开的,就像你想要的那样

          使用它们。

          A static class is singleton by default.
          

          静态类用于定义扩展方法,因为你不想

          实例化它们。

          静态类就像独特服务的全球提供者。

          我希望这对你有意义,并能帮助你理解静态类。

          【讨论】:

            【解决方案9】:

            在内存寻址方面考虑“静态”和“实例”可能会有所帮助。

            静态对象存在于内存中的一个且仅一个位置;您不能创建它的实例,因为根据定义,它已经声明它将在一个特定位置找到。它是“静态的”和不变的。对象的创建是隐式的而不是显式的。

            var result = Math.Pow(3, 3); // static - Math class can't be instanced
            

            一个非静态对象可以被实例化一次或多次;你是说,“为我创建一个这种类型的对象”并且该对象被赋予了一个内存地址。您可以创建多个实例,它们都存在于不同的内存地址中。使用new 关键字显式创建对象。

            var Ted = new Employee(); // instance - creates a new object at a new address
            

            这是人们在 ASP .NET Web 编程中遇到麻烦的地方;静态类为每个应用程序域创建一次,因此它们的构造函数只被调用一次。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-08-19
              • 1970-01-01
              • 2023-01-07
              • 1970-01-01
              • 2011-01-24
              • 2013-07-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多