C# 静态成员与非静态成员
一、核心概念必背区分1. 非静态成员实例成员无 static 修饰字段、属性、方法属于对象实例每个对象拥有独立一份数据对象之间互不干扰必须new 对象后通过对象名调用2. 静态成员有 static 修饰静态字段、静态属性、静态方法属于类不属于对象全局唯一、所有对象共享同一份数据直接通过类名.成员调用无需 new 对象二、调用语法规则固定死规则1. 非静态成员调用必须实例化对象 →对象名.成员People p1 new People(); p1.F1(); p1.Id 1;2. 静态成员调用直接类名调用 →类名.成员People.Age 10; People.F2();三、静态与非静态 互相访问规则超级高频考点1. 非静态方法 / 属性可以随意访问静态成员非静态环境中既能用非静态也能用静态public void F1() { // 允许访问静态属性、静态方法 Age 10; F2(); }2. 静态方法 / 属性不能直接访问非静态成员静态属于类非静态属于对象静态中没有当前对象如果非要访问必须手动 new 对象调用public static void F2() { // 错误直接调用非静态成员报错 // Id 1; // F1(); // 正确手动 new 对象访问 People p new People(); p.F1(); p.Id 1; }总结一句话规则非静态可以随便碰静态静态不能直接碰非静态四、静态与非静态 数据存储区别内存原理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()); //12. 静态属性共享数据所有对象共享同一份静态数据一改全改如果 Num 是静态属性p1.AddNum(); //静态Num1 p2.AddNum(); //静态Num2 // 全部共享同一个值 Console.WriteLine(p1.GetNum()); //2 Console.WriteLine(p2.GetNum()); //2五、超级易错坑点笔试必坑1. 属性赋值死循环禁止在属性set中给属性本身赋值//错误写法死循环 set { Id value; } //正确写法给字段赋值 set { id value; }原因Id值会再次触发set访问器无限递归 → 栈溢出2. 静态无this静态方法中不能使用this因为this代表当前实例对象3. 静态构造函数只执行一次静态成员在程序生命周期内只初始化一次全局共享六、静态 VS 非静态 终极对比表对比项非静态成员静态成员修饰符无 static有 static归属对象实例类调用方式对象名.成员类名.成员数据特点每个对象独立数据所有对象共享同一份数据互相访问可直接访问静态不可直接访问非静态this关键字可以使用不可以使用七、满分背诵口诀static是静态属于类全局共享唯一数据无static实例属于对象每个对象独立数据非静可访静静态不访非静属性set只赋值给字段千万别赋值给属性静态类名点非静对象点