1.静态类
静态类是使用 static 关键字声明的类,静态类与普通类的唯一区别在于,静态类无法进行实例化,即无法使用 new 关键字创建类类型的变量。因此,对于类中成员的访问只可以通过类型来实现。
静态类中只能够包含静态成员,不存在实例构造函数,但可以包含静态构造函数,静态类默认会被密封,因此无法继承静态类,静态类也不会派生自其他任何基类(除 Object)。
静态类可以用作只对输入参数进行操作并且不必获取或设置任何内部实例字段的方法集的方便容器。例如 System.Math 类就是静态类,其内部成员调用实例如下:
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));
// Output:
// 3.14
// -4
// 3
在程序中首次引用类之前初始化其字段并调用其静态构造函数。 静态构造函数只调用一次,在程序所驻留的应用程序域的生存期内,静态类会保留在内存中。
下面是一个静态类的简单实例,实现了取负数的操作:
static class Negative
{
public static int GetNegative(int i)
{
return -i;
}
}
class Program
{
static void Main(string[] args)
{
int a = Negative.GetNegative(10);
Console.WriteLine($"10's negative is {a}");
Console.ReadKey();
}
}
输出结果如下:
10's negative is -10
2.静态成员
非静态类可以包含静态方法、字段、属性或事件。 即使未创建类的任何实例,也可对类调用静态成员。 静态成员始终按类名(而不是实例名称)进行访问。
静态成员只有一个副本存在(与创建的类的实例数无关)。 静态方法和属性无法在其包含类型中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。
静态方法可以进行重载,但不能进行替代,因为它们属于类,而不属于类的任何实例。
虽然字段不能声明为 static const,不过 const 字段在其行为方面本质上是静态的。 它属于类型,而不属于类型的实例。
可在成员的返回类型之前使用 static 关键字声明静态类成员,如下面的示例所示:
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType RunOutOfGas;
// Other non-static fields and properties...
}
在首次访问静态成员之前以及在调用构造函数(如果有)之前,会初始化静态成员。 若要访问静态类成员,使用类的名称指定成员的位置,如下面的示例所示:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
如果类包含静态字段,则提供在类加载时初始化它们的静态构造函数,如下所示:
public class Test
{
static int age;
static Test()
{
age = 10;
}
}