using System; namespace StudyClass { // ====================== 1.普通类:包含实例成员 + 静态成员 ====================== class Person { // --------实例成员(没有static,属于每一个new出来的对象(属于对象),每个对象独立一份)-------- public string Name; // 每个人自己的名字 public int Age; // 每个人自己的年龄 // --------静态成员(static,属于Person类(属于类),全部对象共享同一份)-------- public static int PersonCount; // 统计一共创建了多少个人,所有人共享 // 实例构造函数:new对象的时候执行 public Person(string name, int age) { Name = name; Age = age; PersonCount++; //每new一个人,总人数+1 } // 🔹实例方法:不加static,需要对象调用;可以访问实例成员,也可以访问静态成员 public void ShowMySelf() { // ✅实例方法内:可以访问自己对象的实例变量 Name Age Console.WriteLine($"我叫{Name},今年{Age}岁"); // ✅实例方法内:可以直接访问静态成员 PersonCount Console.WriteLine($"当前总共有 {PersonCount} 个人"); } // 🔹静态方法:加static,归类;不能直接访问实例成员Name/Age public static void ShowTotalPerson() { Console.WriteLine($"【静态方法输出】总人数:{PersonCount}"); // ❌编译报错!静态方法不能直接访问实例成员 // Console.WriteLine(Name); // ✅如果静态方法一定要访问实例成员,必须手动new对象 Person temp = new Person("临时人", 99); Console.WriteLine($"静态方法手动new对象访问实例数据:{temp.Name}\n"); } } // ====================== 2.静态类 static class 专门存放工具 ====================== /// <summary> /// 静态类:全部都是工具方法,不能new对象,不能创建实例,内部只能写static成员,且所有字段、方法,必须强制全部加 static。 /// 类比系统的Math类 /// </summary> static class MathTools { public static double PI = 3.1415926; // 工具:计算圆面积,不需要对象 public static double GetCircleArea(double r) { return PI * r * r; } // ❌静态类里面不能写实例方法,也不能 new,写了直接报错 // public void Test(){} } // ====================== 程序入口 Main,必须是 static ====================== class Program { // Main必须static:程序启动的时候,还没有任何 new 出来的对象,.NET 只能直接调用类身上的静态 Main 作为入口。 static void Main(string[] args) { Console.WriteLine("=====1.测试普通类:实例对象、静态共享数据====="); // new两个独立对象,每个对象有自己的Name、Age Person p1 = new Person("张三", 18); Person p2 = new Person("李四", 22); // 调用实例方法:必须用 对象.方法() p1.ShowMySelf(); p2.ShowMySelf(); // 调用静态方法:直接类名.方法(),不需要new Person.ShowTotalPerson(); Console.WriteLine("=====2.测试静态类MathTools,工具类不用new====="); double area = MathTools.GetCircleArea(5); Console.WriteLine($"半径5的圆面积 = {area}\n"); // ❌静态类不能new! // MathTools tool = new MathTools(); Console.WriteLine("=====3.回顾你最初的代码:实例方法 VS 静态方法调用====="); Program pro = new Program(); pro.GreetInstance(); //实例方法,必须new对象调用 GreetStatic(); //同类静态方法,Main(static)可以直接调用 Console.ReadKey(); } // 实例方法(随便访问静态成员):没有static void GreetInstance() { Console.WriteLine("这是【实例方法GreetInstance】,必须new对象才能调用"); } // 静态方法(不能直接碰实例成员,要访问必须手动 new 对象):加static static void GreetStatic() { Console.WriteLine("这是【静态方法GreetStatic】,不需要对象,可以在Main直接调用\n"); Console.WriteLine("=====4.最后记住:所有方法必须写在 class 类里面,不能裸露在 namespace 下,没有游离的全局方法/函数====="); } } }C# 类、对象和方法知识点逐条整理:
## 一、实例成员(不加`static`,属于**对象**)
1. 实例成员包含:实例变量、实例方法。依附于`new`出来的对象。
2. 每执行一次`new 类名()`,就创建一份独立的实例数据,多个对象之间数据互不干扰。
3. 调用方式:**对象.成员名**,不new对象就无法使用实例成员。
4. 实例方法内:✅可以直接访问本对象的实例成员;✅**可以直接访问静态成员**。
## 二、静态成员(加`static`,属于**类**)
5. 静态成员包含:静态变量、静态方法。类加载进内存时就存在,**不需要new对象**。
6. 全部对象**共享同一份静态数据**,一处修改,所有对象读取到的值全部改变。
7. 调用方式:**类名.成员名**;同类内部可以省略类名直接调用。
8. 核心铁律:**静态看不见实例,实例看得见静态** - 静态方法中,❌不能直接裸写实例变量/实例方法(没有默认对象,编译器不知道访问哪一个对象)。 - 静态方法如果一定要使用实例成员:必须手动`new`对象,通过`对象.实例成员`访问。 - 实例方法可以直接读取静态成员:实例方法运行时对象一定存在,静态成员一直驻留内存。
## 三、Main入口方法
9. `static void Main()` 必须带`static`。
10. 原因:程序刚启动,还没有任何new出来的对象;.NET直接调用类的静态Main开启程序。
11. 只有进入Main之后,代码中才可以手动`new`创建对象。
## 四、静态类 `static class`
12. 静态类专门用于存放纯工具功能,类比系统`Math`。
13. ❌禁止`new`,不能创建实例对象。
14. 静态类内部**只允许写static成员,不能写实例变量、实例方法**,编译器强制报错。
15. 不能被继承,也不能继承其他类。
## 五、普通类 vs 静态类
16. 普通类`class 类名`:可以同时拥有实例成员+静态成员;允许new对象。适合描述现实实体(Person、Student)。
17. 静态类`static class 类名`:全部成员强制static,禁止new。只适合纯工具,不描述实体。
18. 即使普通类可以写静态方法,静态类提供编译器强制约束,防止写出无意义、错误的代码,代码语义更清晰。
## 六、什么时候加static,什么时候不加
19. ✅加`static`:工具函数、全部对象共享的数据,和具体对象个体无关。
20. ❌不加`static`:描述实体事物,每个对象需要保存自己独立的数据和行为。
21. 不要为了省事全部加static;实体全部static会造成全部对象共用一套数据,业务逻辑错乱。 ##
七、C#语法硬性规则
22. C#**没有真正的全局方法**,所有自定义方法必须写在`class {}`里面,不能裸露在namespace下。
23. C#9顶级语句只是语法糖,底层仍然生成隐藏class和Main,不能在顶级语句下自定义方法。
## 八、高频报错与解决
24. 在static的Main里直接调用实例方法 → 报错。 - 方案①:给方法加static;方案②:new对象,`对象.方法()`调用。
25. 静态方法直接裸写实例变量名 → 报错。 - 方案:手动new对象,通过对象访问实例数据。
26. `new`静态类 → 编译报错,静态类禁止实例化。
## 九、记忆口诀
> 实例归对象,必须new出来;静态归类有,直接就能用。
> 静态不见实例物,要访问得new对象;实例可见静态物,静态常驻内存处。
> Main要static,启动无对象;静态类全static,绝不允许new。
以后写代码拿不准要不要写 static,就问自己两句话:
- 这个东西是属于某个个体对象吗?是 → 不加 static。
- 这是工具 / 大家共用的数据吗?是 → 加 static。