当前位置: 首页 > news >正文

【20260815】C# 类、对象和方法

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,就问自己两句话:
  1. 这个东西是属于某个个体对象吗?是 → 不加 static。
  2. 这是工具 / 大家共用的数据吗?是 → 加 static。
http://www.cnnetsun.cn/news/4048094.html

相关文章:

  • 慕课网职场人必修课:高效沟通与自信表达
  • 绿色免安装拼图工具 PintuMaster 1.6 技术解析:不写注册表、不占 C 盘,如何实现 0 成本搞定证件照/发票拼图?
  • 手机双目虚化拍照课程目录:从零到落地
  • 以实战论 AI:诚邀一线工程师分享模型调优、工程落地真实案例
  • 098、LVGL LED样式与亮度控制
  • 电网建模基石:正序参数与等值电路原理、应用与工程实践
  • 面阵 vs 线阵,为什么高速产线非它不可?——线阵相机深度详解
  • Mockoon 实战指南:本地 Mock 数据方案与前后端高效协作
  • OneNote链接被组织策略阻止?注册表修复与协议关联排查指南
  • 机器人专业热浪下的冷真相:招得多,钱和门槛藏玄机
  • IMX927深度解析:索尼Pregius S背照式全局快门技术赋能1亿像素工业检测
  • 滑移反铁电MoS2中量子度规驱动的
  • MySQL系统表mysql.user缺失的深度解析与修复指南
  • 从Hello World到工程构建:g++编译器的核心原理与实战指南
  • FreeRTOS调度器:让多任务有条不紊的“大管家”
  • 2026年学校知网AI率要求20%?自查工具与检测口径详解!
  • 2026年8月合同销毁回收方式排行榜:哪种环保?看完这篇再决定
  • 学校指定知网检测完整攻略!低成本自查论文AI率是否达标!
  • Dravet综合征孩子的“救命药“:司替戊醇如何让80%患儿癫痫发作大幅减少
  • ReactOS 图形系统分析(25):多显示器/平移显示与杂项 — multidisp.c / pandisp.c / engmisc.c
  • 193、飞控中的无人机集群:未来趋势与挑战
  • 基于Springboot的小香葱种植管理系统源码+文档
  • Turnitin降AI英文怎么改,BunnyScholar最省心
  • 【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
  • 云安全左移:解析默认防火墙与API开放对运维的影响
  • Hive存储格式深度解析:从TextFile到ORC/Parquet的性能调优实战
  • UML用例图实战指南:从需求沟通到系统设计的可视化建模
  • LaTeX表格加粗排版难题:原理剖析与四种稳健解决方案
  • PostgreSQL启动失败排查指南:从日志分析到六大常见原因解决
  • SpringBoot集成Druid监控:Web界面配置、SQL性能分析与生产安全实践