C# 中的静态关键字

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 error.jpg

在上面的例子中,我们得到了一个编译时错误。提示说不能在静态类中声明实例成员。

问:如果在静态类中,我们没有非静态成员/函数,那么它是否拥有任何默认构造函数?

**答案是:**是的,它确实有一个构造函数,但它也被声明为静态的。

在上面的例子中,我们尝试创建一个实例构造函数,但在编译时出现错误。因此,我们将其声明为静态。

现在我们已经将构造函数声明为静态的,但是在编译时,我们再次遇到一个错误。

那么,让我们纠正这个错误。要纠正这个错误,我们必须删除公共访问修饰符。

问:静态构造函数可以有 public/private/internal/protected internal 访问修饰符吗?

答案是:,静态构造函数不包含任何访问修饰符。我们已经在前面的例子中看到了实现。

声明为静态的类/方法/字段的内存管理

当引用静态类的程序加载时,.NET Framework 公共语言运行时 (CLR) 会加载该类的信息类型。程序无法准确指定类的加载时间。但是,可以保证在程序中第一次引用该类之前加载该类,并初始化其字段并调用其静态构造函数。静态构造函数仅调用一次,并且静态类在程序所在的应用程序域的整个生存期内都保留在内存中。

相关推荐
小白学大数据23 分钟前
Codex 里的 GPT 6 Astra、GPT 5.6 Sol、Terra、Luna 怎么选
开发语言·gpt·microsoft
l1t2 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构
djarmy8 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO98 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧8 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精8 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠8 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫8 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141919 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉9 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑