平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“C# 静态成员与非静态成员的实现方法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
无 static 修饰:字段、属性、方法
有 static 修饰:静态字段、静态属性、静态方法
必须实例化对象 → 对象名.成员
People p1 = new People();
p1.F1();
p1.Id = 1;
直接类名调用 → 类名.成员
People.Age = 10;
People.F2();
非静态环境中,既能用非静态,也能用静态
public void F1()
{
// 允许访问静态属性、静态方法
Age = 10;
F2();
}
静态属于类,非静态属于对象,静态中没有当前对象
如果非要访问:必须手动 new 对象调用
public static void F2()
{
// 错误:直接调用非静态成员报错
// Id = 1;
// F1();
// 正确:手动 new 对象访问
People p = new People();
p.F1();
p.Id = 1;
}
每个对象拥有自己独立的数据,互不影响
People p1 = new People();
p1.AddNum(); // p1.Num = 1
People p2 = new People();
p2.AddNum(); // p2.Num = 1
// 两个对象Num互不干扰,都是1
Console.WriteLine(p1.GetNum()); //1
Console.WriteLine(p2.GetNum()); //1
所有对象共享同一份静态数据,一改全改
如果 Num 是静态属性:
p1.AddNum(); //静态Num=1
p2.AddNum(); //静态Num=2
// 全部共享同一个值
Console.WriteLine(p1.GetNum()); //2
Console.WriteLine(p2.GetNum()); //2
禁止在属性set中给属性本身赋值
//错误写法:死循环
set
{
Id = value;
}
//正确写法:给字段赋值
set
{
id = value;
}
原因:Id=值 会再次触发set访问器,无限递归 → 栈溢出
静态方法中 不能采用this,因为this代表当前实例对象
静态成员在程序生命周期内 只初始化一次,全局共享
对比项 | 非静态成员 | 静态成员 |
|---|---|---|
修饰符 | 无 static | 有 static |
归属 | 对象(实例) | 类 |
调用方式 | 对象名.成员 | 类名.成员 |
数据特点 | 每个对象独立数据 | 所有对象共享同一份数据 |
互相访问 | 可直接访问静态 | 不可直接访问非静态 |
this关键字 | 能够采用 | 不能够采用 |
理解这一步时,总的来说,C# 静态成员适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。
DeepSeek多模态怎么样及保姆级配置教程(codex、claude)实用指南
WSL2+Docker+Ollama本地部署大模型思路和实践指南(Qwen1.8b)实用指南
DeepSeek Harness热门插件盘点:10个实用插件,覆盖多Agent、上下文和多模态实用指南
grep文本搜索与正则表达式完整代码示例实用指南
AI漫剧伪装直男1‑24集无雾版夸克网盘资源免费分享
AI漫剧玉僧入尘1-68集无雾无删版夸克网盘资源免费分享