静态的
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 constructor
。static 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 之前无法通过垃圾收集器运行。
-
静态类无法实现接口。