C# 语言中的 static 关键字用于声明静态类和静态类成员。静态类和静态类成员(如构造函数、字段、属性、方法和事件)在只需要一个对象(类或类成员)副本并在类型(和成员)的所有实例(对象)之间共享时很有用。
让我们简化一下。假设您有一个类“CSharpSite”,它代表 C#Site网站、其属性及其功能。CSharpSite 类有四个属性,Founder、YearFounded、Location 和 Description。我们知道所有这些属性都是固定的,无论各种程序或类创建了多少个 CSharpCorner 类型的实例,它们都不会改变。这是一个静态类和静态属性的完美示例。
**注意:**您可以更改静态成员值,但最后更新的值将对调用静态成员的所有程序或调用者可用。
让我们看看一些简单例子的用法并尝试理解这些概念。
C# 中的静态变量
变量可以声明为静态。
案例分析
当我们不想创建一个变量的多个实例时,即我们想要在类的多个实例之间访问相同的值时,我们可以选择一个静态变量。
要访问静态变量,我们不需要创建类的对象。可以通过类名来访问。
注意: 如果我们在非静态方法中操作静态变量,那么每次创建对象时都会调用非静态方法,并且对静态变量的更改将在先前创建的每个对象之间共享。
我们来看一个例子。
执行 Add2Numbers() 方法后,静态变量的值已更新为 20。
现在我们再创建一个对象来调用 PrintStaticVariable() 方法。执行 PrintStaticVariable() 方法后,所有位置的值均已修改为 30。
C# 中的静态方法
案例分析
当我们有一个场景,只关注输出而不需要存储或检索某个类的特定实例所特有的数据时,我们可以选择静态方法。
要访问静态方法,我们也需要使用类名。不需要实例。
问:静态方法可以访问非静态字段吗?
答案是肯定的。静态方法可以直接访问静态字段,而无需使用类名。但是,要访问非静态字段,需要创建一个对象。上图显示了一个示例。
C# 中的静态类
案例分析
当我们将类中的所有成员函数和数据成员声明为静态时,我们应该将该类声明为静态。换句话说,我们可以说静态类不应包含任何非静态字段/方法。
我们来看一个例子。
https://www.c-sharpcorner.com/UploadFile/36bc15/static-keyword-in-C-Sharp/Images/read%20error.jpg
在上面的例子中,我们得到了一个编译时错误。提示说不能在静态类中声明实例成员。
问:如果在静态类中,我们没有非静态成员/函数,那么它是否拥有任何默认构造函数?
**答案是:**是的,它确实有一个构造函数,但它也被声明为静态的。
在上面的例子中,我们尝试创建一个实例构造函数,但在编译时出现错误。因此,我们将其声明为静态。
现在我们已经将构造函数声明为静态的,但是在编译时,我们再次遇到一个错误。
那么,让我们纠正这个错误。要纠正这个错误,我们必须删除公共访问修饰符。
问:静态构造函数可以有 public/private/internal/protected internal 访问修饰符吗?
答案是:,静态构造函数不包含任何访问修饰符。我们已经在前面的例子中看到了实现。
声明为静态的类/方法/字段的内存管理
当引用静态类的程序加载时,.NET Framework 公共语言运行时 (CLR) 会加载该类的信息类型。程序无法准确指定类的加载时间。但是,可以保证在程序中第一次引用该类之前加载该类,并初始化其字段并调用其静态构造函数。静态构造函数仅调用一次,并且静态类在程序所在的应用程序域的整个生存期内都保留在内存中。