C#零基础通关第六篇:吃透静态、常量与只读,分清静态与实例的本质差异
上一篇我们彻底掌握了面向对象三大核心特性封装、继承、多态学会了通过类封装数据、通过继承复用代码、通过多态实现灵活拓展。我们之前写的所有字段、属性、方法都属于实例成员必须实例化对象后才能调用。但在实际项目开发中有很多通用工具方法、全局共享数据、固定不变的常量根本不需要反复 new 对象。这就引出了C#开发中最容易混淆、面试必考、项目必用的核心知识点静态成员、静态类、const常量、readonly只读。很多新手写代码多年依然分不清静态和实例到底有什么区别const和readonly看着一样为什么不能混用什么时候用静态类、什么时候用普通类本篇从零拆解所有核心概念搭配可落地实战代码彻底扫清这块知识盲区补齐面向对象的最后一块核心短板。一、前置核心实例 vs 静态本质区别在学习具体语法前我们先搞懂最核心的底层逻辑这是所有知识点的基础。1. 实例成员之前所学全部内容我们之前写的普通属性、普通方法都属于实例成员。归属归属于对象不归属于类调用方式必须new 类名()实例化对象后调用内存特点每 new 一个对象就会开辟一块独立内存对象之间数据互不干扰场景每个对象独有、独立的数据和行为学生姓名、年龄、学习行为2. 静态成员本篇核心被static修饰的成员统称为静态成员。归属归属于类不归属于任何对象调用方式直接类名.成员名调用无需 new 对象内存特点全局唯一整个程序运行期间只开辟一块内存所有对象共享同一份数据场景全局共享数据、通用工具方法、统计计数3. 一句话总结实例成员每个对象各有一份互不干扰静态成员整个类只有一份全员共享。二、静态成员静态字段与静态方法1. 静态字段static 字段普通字段是对象独有静态字段是类共享适合存储全局公共数据、统计数据。我们用「学生人数统计」实战演示这是静态字段最经典的应用场景。usingSystem;classStudent{// 实例属性每个学生独有publicstringName{get;set;}publicintAge{get;set;}// 静态字段全局共享统计学生总人数publicstaticintTotalCount0;// 构造函数每创建一个学生人数1publicStudent(stringname,intage){Namename;Ageage;// 所有对象共享同一个静态字段TotalCount;}}classProgram{staticvoidMain(){// 创建多个学生对象Students1newStudent(张三,18);Students2newStudent(李四,19);Students3newStudent(王五,18);// 直接通过类名调用静态字段Console.WriteLine($当前学生总人数{Student.TotalCount});}}运行结果当前学生总人数3可以清晰看出多个对象共用同一个静态字段实现了全局统计效果这是实例字段完全做不到的。2. 静态方法static 方法被 static 修饰的方法无需实例化直接类名调用核心场景通用工具方法数学计算、格式转换、数据校验。⚠️核心规则必考静态方法中只能直接访问静态成员静态方法中不能直接访问实例成员必须实例化对象后才能访问实例方法中可以直接访问静态成员usingSystem;// 通用工具类classMathTool{// 静态方法计算两数之和publicstaticintGetSum(inta,intb){returnab;}// 静态方法计算平方publicstaticintGetSquare(intnum){returnnum*num;}}classProgram{staticvoidMain(){// 无需new对象直接类名调用Console.WriteLine($1020{MathTool.GetSum(10,20)});Console.WriteLine($10的平方{MathTool.GetSquare(10)});}}三、静态构造函数特殊核心语法静态构造函数是新手最容易懵的知识点它和实例构造函数完全不同专门用来初始化静态成员。1. 静态构造函数特性必记无访问修饰符、无参数一个类只能有一个静态构造函数程序运行中只会执行一次在第一次使用类时自动触发优先级高于实例构造函数优先执行2. 实战演示usingSystem;classTest{publicstaticstringMsg;// 静态构造函数初始化静态数据staticTest(){Msg静态数据初始化完成;Console.WriteLine(静态构造函数执行);}// 实例构造函数publicTest(){Console.WriteLine(实例构造函数执行);}}classProgram{staticvoidMain(){// 第一次使用类触发静态构造函数Console.WriteLine(Test.Msg);// 多次实例化静态构造函数不再执行Testt1newTest();Testt2newTest();}}执行顺序静态构造函数 → 输出信息 → 两次实例构造函数四、静态类static class被 static 修饰的类即为静态类项目中专门用来写工具类、帮助类。1. 静态类核心特性只能包含静态成员不能有实例成员禁止实例化不能 new 对象程序加载时自动初始化全局可调用2. 实战标准工具类项目常用模板usingSystem;// 静态工具类全部为通用静态方法staticclassStringTool{// 字符串判空publicstaticboolIsEmpty(stringstr){returnstring.IsNullOrEmpty(str);}// 反转字符串publicstaticstringReverseStr(stringstr){char[]charsstr.ToCharArray();Array.Reverse(chars);returnnewstring(chars);}}classProgram{staticvoidMain(){stringtestC#零基础;Console.WriteLine(StringTool.IsEmpty(test));Console.WriteLine(StringTool.ReverseStr(test));}}项目中所有工具方法数据校验、格式处理、算法封装统一放在静态类中是企业开发规范。五、常量 const 与 只读 readonly高频混淆点很多新手分不清 const 和 readonly二者都是「只读不可修改」但底层机制、使用场景完全不同是面试和项目的高频考点。1. const 常量编译时常量本质编译期常量程序编译时就确定值不可修改修饰默认是静态无需加 static赋值必须在定义时直接赋值不能延迟赋值场景全局固定不变的数值圆周率、版本号、状态码2. readonly 只读运行时常量本质运行时常量程序运行时确定值赋值后不可修改修饰属于实例成员可搭配static变为静态只读赋值可以定义时赋值也可以在构造函数中赋值场景对象初始化时确定、后续永不修改的数据3. 代码对比实战usingSystem;classConfig{// const 编译时常量定义必须赋值全局静态只读publicconstdoublePI3.1415926;// readonly 实例只读字段可在构造函数赋值publicreadonlystringVersion;publicConfig(){// 允许在构造函数赋值VersionV1.0.0;// 报错const 不能在构造函数赋值// PI 3.14;}}classProgram{staticvoidMain(){// const 直接类名调用Console.WriteLine(Config.PI);ConfigcfgnewConfig();Console.WriteLine(cfg.Version);// 报错只读/常量禁止二次赋值// cfg.Version V2.0;// Config.PI 3.15;}}4. 核心取舍规则固定死的数值永不改变用 const运行时确定、后续不变的数值用 readonly六、全文整合实战案例整合静态类、静态成员、常量、只读实现一个简易项目配置工具完全贴合企业开发场景usingSystem;// 全局静态配置工具类staticclassAppConfig{// 常量固定项目版本publicconststringProjectNameC#零基础教程;// 静态只读运行时初始化publicstaticreadonlystringRunTime;// 静态构造函数初始化静态数据staticAppConfig(){RunTimeDateTime.Now.ToString(yyyy-MM-dd);}// 静态工具方法打印配置信息publicstaticvoidPrintConfig(){Console.WriteLine($项目名称{ProjectName});Console.WriteLine($启动时间{RunTime});}}classProgram{staticvoidMain(){// 直接调用静态类方法AppConfig.PrintConfig();}}七、新手高频易错坑点必避静态方法不能调用实例成员静态属于类实例属于对象生命周期不同禁止直接调用静态构造函数只会执行一次无论实例化多少次对象静态构造函数仅首次加载类时执行静态类不能实例化静态类专为工具方法设计不需要 new 对象const必须当场赋值编译时常量不支持构造函数延迟赋值readonly支持静态数据全局共享多对象修改同一个静态字段会互相影响慎用静态存储可变数据。八、全文核心总结实例成员归属于对象每个对象独立必须 new 调用静态成员归属于类全局共享直接类名调用适合工具方法、全局统计静态类专门存放通用工具方法禁止实例化是项目开发标准工具类写法const常量编译期固定值全局静态适合固定参数readonly只读运行时赋值赋值后不可修改适合动态初始化的固定数据。静态与实例的区分、常量与只读的使用是后续学习框架开发、工具封装、多线程的基础务必吃透。下期预告下一篇我们将精讲C# 委托与事件这是C#独有的核心高级特性是Unity游戏开发、窗体事件编程、框架解耦的核心关键零基础也能轻松听懂