静态类和普通类有什么区别?

时间:2010-05-28 13:06:57

标签: c# .net oop

我应该什么时候选择静态课程还是普通课程?或者:它们之间有什么区别?

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 :)
    }
}

9 个答案:

答案 0 :(得分:30)

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

例如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;
    }       
}

答案 1 :(得分:15)

  • 静态类不能是instantiatedinherited
  • 静态类在输出MSIL中由编译器标记为sealedabstract
  • 静态类的所有成员也必须是静态的。
  • 只有静态类可以托管extension methods
  • 静态类不能用作泛型类型参数。

答案 2 :(得分:4)

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

var normal = new Normal();

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

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

答案 3 :(得分:3)

来自MSDN documentation on static classes

  

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

答案 4 :(得分:1)

简单来说:

无法使用new关键字实例化静态类。 静态类中的所有方法都必须是静态的,并且可以在没有实例化的情况下直接调用。

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

如果没有首先实例化包含类,则无法调用“普通”类中的非静态方法。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

静态类是无法实例化的类。因此,它可以用作某个对象的多个实例的“模板”,这些实例符合类定义,就像普通类一样。在普通类中,定义的数据成员是为类的每个“实例”创建的,并且每个“实例”都有自己的这些数据成员集,因此这些实例代表某些对象的单个“实体”或复杂的内存数据结构(您将该类编码为代表)。

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

答案 7 :(得分:0)

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

静态类是无法实现且无法扩展的类。

默认情况下,这意味着a static class is sealed and abstract,您可以查看

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

因此,由于无法实例化静态类,因此无法定义实例方法

关于静态类,所以所有方法都必须是静态的和公共的,如你想要的那样

使用它们。

A static class is singleton by default.

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

实现他们。

静态类就像是唯一服务的全局提供者。

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

答案 8 :(得分:0)

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

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

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网络编程中遇到麻烦的地方;每个Application Domain创建一次静态类,因此它们的构造函数只调用一次。