C# - 静态类、方法、构造函数、字段
在 C# 中,静态意味着无法实例化。你不能创建静态类的对象,也不能使用对象访问静态成员。
C# 中的类、变量、方法、属性、运算符、事件和构造函数可以使用 `static` 修饰符关键字定义为静态。
静态类
在类名之前和访问修饰符之后应用 `static` 修饰符,可以将类声明为静态。下面定义了一个包含静态字段和方法的静态类。
public static class Calculator
{
private static int _resultStorage = 0;
public static string Type = "Arithmetic";
public static int Sum(int num1, int num2)
{
return num1 + num2;
}
public static void Store(int result)
{
_resultStorage = result;
}
}
上面,`Calculator` 类是静态的。它的所有成员也都是静态的。
你不能创建静态类的对象;因此,静态类的成员可以直接使用类名访问,如 `ClassName.MemberName`,如下所示。
class Program
{
static void Main(string[] args)
{
var result = Calculator.Sum(10, 25); // calling static method
Calculator.Store(result);
var calcType = Calculator.Type; // accessing static variable
Calculator.Type = "Scientific"; // assign value to static variable
}
}
静态类的规则
- 静态类不能被实例化。
- 静态类的所有成员必须是静态的;否则编译器会报错。
- 静态类可以包含静态变量、静态方法、静态属性、静态运算符、静态事件和静态构造函数。
- 静态类不能包含实例成员和实例构造函数。
- 索引器和析构函数不能是静态的。
- 不能使用 `var` 来定义静态成员。你必须在 `static` 关键字之后明确指定成员的类型。
- 静态类是密封类,因此不能被继承。
- 静态类不能从其他类继承。
- 静态类成员可以使用 `ClassName.MemberName` 访问。
- 静态类在其程序所在的应用程序域的生命周期内保留在内存中。
非静态类中的静态成员
普通类(非静态类)可以包含一个或多个静态方法、字段、属性、事件和其他非静态成员。
定义一个包含一些静态成员的非静态类比将整个类声明为静态更实用。
静态字段
非静态类中的静态字段可以使用 `static` 关键字定义。
非静态类的静态字段在所有实例之间共享。因此,一个实例所做的更改会反映在其他实例中。
public class StopWatch
{
public static int NoOfInstances = 0;
// instance constructor
public StopWatch()
{
StopWatch.NoOfInstances++;
}
}
class Program
{
static void Main(string[] args)
{
StopWatch sw1 = new StopWatch();
StopWatch sw2 = new StopWatch();
Console.WriteLine(StopWatch.NoOfInstances); //2
StopWatch sw3 = new StopWatch();
StopWatch sw4 = new StopWatch();
Console.WriteLine(StopWatch.NoOfInstances);//4
}
}
静态方法
你可以在非静态类中定义一个或多个静态方法。静态方法无需创建对象即可调用。你不能使用非静态类的对象来调用静态方法。
静态方法只能调用其他静态方法和访问静态成员。你不能在静态方法中访问类的非静态成员。
class Program
{
static int counter = 0;
string name = "Demo Program";
static void Main(string[] args)
{
counter++; // can access static fields
Display("Hello World!"); // can call static methods
name = "New Demo Program"; //Error: cannot access non-static members
SetRootFolder("C:MyProgram"); //Error: cannot call non-static method
}
static void Display(string text)
{
Console.WriteLine(text);
}
public void SetRootFolder(string path) { }
}
静态方法的规则
- 静态方法可以使用 `static` 关键字在返回类型之前和访问修饰符之后定义。
- 静态方法可以被重载,但不能被重写。
- 静态方法可以包含局部静态变量。
- 静态方法不能访问或调用非静态变量,除非它们作为参数明确传递。
静态构造函数
非静态类可以包含一个无参数的静态构造函数。它可以使用 static 关键字定义,并且没有 public、private 和 protected 等访问修饰符。
以下示例演示了静态构造函数和实例构造函数之间的区别。
public class StopWatch
{
// static constructor
static StopWatch()
{
Console.WriteLine("Static constructor called");
}
// instance constructor
public StopWatch()
{
Console.WriteLine("Instance constructor called");
}
// static method
public static void DisplayInfo()
{
Console.WriteLine("DisplayInfo called");
}
// instance method
public void Start() { }
// instance method
public void Stop() { }
}
上面,非静态类 `StopWatch` 包含一个静态构造函数和一个非静态构造函数。
静态构造函数只在首次使用静态方法或创建实例时调用一次。以下示例显示,静态方法首次调用时会调用静态构造函数。从第二次开始调用静态方法将不会调用静态构造函数。
StopWatch.DisplayInfo(); // static constructor called here
StopWatch.DisplayInfo(); // none of the constructors called here
DisplayInfo 被调用。
DisplayInfo 被调用。
以下示例显示,首次创建实例时会调用静态构造函数。
StopWatch sw1 = new StopWatch(); // First static constructor and then instance constructor called
StopWatch sw2 = new StopWatch();// only instance constructor called
StopWatch.DisplayInfo();
实例构造函数被调用。
实例构造函数被调用。
DisplayInfo 被调用。
静态构造函数的规则
- 静态构造函数使用 `static` 关键字定义,并且不使用 public、private 或 protected 等访问修饰符。
- 非静态类可以包含一个无参数的静态构造函数。不允许使用带参数的静态构造函数。
- 静态构造函数在其生命周期内只执行一次。因此,如果一个类在多个地方使用,你无法确定它何时会在应用程序中被调用。
- 静态构造函数只能访问静态成员。它不能包含或访问实例成员。
了解更多关于静态类和静态构造函数的信息。