静态的

static 修饰符用于声明静态成员,该成员不需要实例化以便被访问,而是仅通过其名称(即 DateTime.Now)访问。

static 可以与类,字段,方法,属性,运算符,事件和构造函数一起使用。

虽然类的实例包含该类的所有实例字段的单独副本,但每个静态字段只有一个副本。

class A
{
    static public int count = 0;

    public A()
    {
        count++;
    }
}

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        A b = new A();
        A c = new A();

        Console.WriteLine(A.count); // 3 
    }
}

count 等于 A 类的实例总数。

static 修饰符还可用于声明类的静态构造函数,初始化静态数据或运行仅需要调用一次的代码。在第一次引用类之前调用​​静态构造函数。

class A
{
    static public DateTime InitializationTime;

    // Static constructor
    static A()
    {
        InitializationTime = DateTime.Now;
        // Guaranteed to only run once
        Console.WriteLine(InitializationTime.ToString());
    }
}

static class 使用 static 关键字标记,并且可以用作处理参数的一组方法的有益容器,但不一定需要绑定到实例。由于该类的 static 性质,它无法实例化,但它可以包含一个 static constructorstatic class 的一些功能包括:

  • 不能继承
  • 除了 Object 之外,不能继承任何东西
  • 可以包含静态构造函数,但不包含实例构造函数
  • 只能包含静态成员
  • 是密封的

编译器也很友好,并且会让开发人员知道类中是否存在任何实例成员。一个示例是在美国和加拿大指标之间转换的静态类:

static class ConversionHelper {
    private static double oneGallonPerLitreRate = 0.264172;

    public static double litreToGallonConversion(int litres) {
        return litres * oneGallonPerLitreRate;
    }
}

当类声明为 static 时:

public static class Functions
{
  public static int Double(int value)
  {
    return value + value;
  }
}

类中的所有函数,属性或成员也需要声明为 static。不能创建类的实例。从本质上讲,静态类允许你创建逻辑上组合在一起的函数包。

由于 C#6 static 也可以与 using 一起使用来导入静态成员和方法。它们可以在没有类名的情况下使用。

老方式,没有 using static

using System;

public class ConsoleApplication
{
    public static void Main()
    {
         Console.WriteLine("Hello World!"); //Writeline is method belonging to static class Console
    }

}

using static 的例子

using static System.Console;

public class ConsoleApplication
{
    public static void Main()
    {
         WriteLine("Hello World!"); //Writeline is method belonging to static class Console
    }

}

缺点

虽然静态类可以非常有用,但它们确实有自己的警告:

  • 一旦调用了静态类,该类就会加载到内存中,并且在卸载包含静态类的 AppDomain 之前无法通过垃圾收集器运行。

  • 静态类无法实现接口。