2026/4/6 3:58:56
网站建设
项目流程
阜新网站制作,网站设计 网站开发 西安,wordpress 支持软件,四年级的简短新闻播报C# 类与实例教程#xff1a;从基础到高级应用
类是 C# 面向对象编程的核心概念#xff0c;它允许我们创建自定义类型#xff0c;封装数据和行为。
1. 类的基本概念
1.1 什么是类#xff1f;
类是创建对象的蓝图或模板#xff0c;它定义了对象的#xff1a;
数据#xff…C# 类与实例教程从基础到高级应用类是 C# 面向对象编程的核心概念它允许我们创建自定义类型封装数据和行为。1. 类的基本概念1.1 什么是类类是创建对象的蓝图或模板它定义了对象的数据字段/属性对象的状态行为方法对象可以执行的操作事件对象可以响应的通知嵌套类型类中定义的其他类、结构体等1.2 简单类示例// 定义一个简单的 Person 类publicclassPerson{// 字段数据成员privatestringname;privateintage;// 构造函数publicPerson(stringname,intage){this.namename;this.ageage;}// 方法行为publicvoidIntroduce(){Console.WriteLine($Hello, my name is{name}and Im{age}years old.);}}2. 创建实例对象2.1 实例化类使用new关键字创建类的实例// 创建 Person 类的实例Personperson1newPerson(Alice,30);Personperson2newPerson(Bob,25);// 调用方法person1.Introduce();// 输出: Hello, my name is Alice and Im 30 years old.person2.Introduce();// 输出: Hello, my name is Bob and Im 25 years old.2.2 对象生命周期实例化分配内存并调用构造函数使用通过实例访问成员垃圾回收当没有引用指向对象时GC 自动回收内存3. 类成员详解3.1 字段Fields类的变量成员通常声明为privatepublicclassBankAccount{privatedecimalbalance;// 字段publicvoidDeposit(decimalamount){balanceamount;}}3.2 属性Properties提供对字段的安全访问通常包含get和set访问器publicclassBankAccount{privatedecimalbalance;// 属性publicdecimalBalance{get{returnbalance;}privateset{balancevalue;}// 限制只能在类内部设置}// 自动实现的属性简化写法publicstringAccountNumber{get;privateset;}publicBankAccount(stringaccountNumber){AccountNumberaccountNumber;}}3.3 方法Methods定义对象的行为publicclassCalculator{// 实例方法publicintAdd(inta,intb){returnab;}// 静态方法属于类而非实例publicstaticdoubleSquareRoot(doublex){returnMath.Sqrt(x);}}// 使用CalculatorcalcnewCalculator();intsumcalc.Add(5,3);// 调用实例方法doublerootCalculator.SquareRoot(16);// 调用静态方法3.4 构造函数Constructors初始化对象状态的特殊方法publicclassCar{publicstringModel{get;}publicintYear{get;}// 默认构造函数publicCar(){ModelUnknown;YearDateTime.Now.Year;}// 带参数的构造函数publicCar(stringmodel,intyear){Modelmodel;Yearyear;}// 构造函数链publicCar(stringmodel):this(model,DateTime.Now.Year){}}3.5 析构函数DestructorsC# 中更常用IDisposable模式publicclassResourceHolder:IDisposable{privatebooldisposedfalse;// 实现 IDisposablepublicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(booldisposing){if(!disposed){if(disposing){// 释放托管资源}// 释放非托管资源disposedtrue;}}// 析构函数备用~ResourceHolder(){Dispose(false);}}4. 访问修饰符控制类成员的可访问性修饰符同一类同一程序集派生类其他程序集public✓✓✓✓private✓✗✗✗protected✓✓✓✗internal✓✓✗✗protected internal✓✓✓✗ (除非也是派生类)5. 高级特性5.1 静态类不能被实例化只能包含静态成员publicstaticclassMathUtilities{publicstaticreadonlydoublePi3.14159;publicstaticintFactorial(intn){if(n1)return1;returnn*Factorial(n-1);}}// 使用doubleareaMathUtilities.Pi*5*5;intfactMathUtilities.Factorial(5);5.2 分部类Partial Classes将类定义分散在多个文件中// File1.cspublicpartialclassEmployee{publicstringFirstName{get;set;}publicstringLastName{get;set;}}// File2.cspublicpartialclassEmployee{publicstringFullName${FirstName}{LastName};publicvoidPrintInfo(){Console.WriteLine($Employee:{FullName});}}5.3 嵌套类在类内部定义另一个类publicclassOuterClass{privateintouterValue10;publicclassNestedClass{publicvoidPrintOuterValue(OuterClassouter){// Console.WriteLine(outerValue); // 错误不能直接访问Console.WriteLine(outer.outerValue);// 需要通过外部类实例访问}}}// 使用OuterClassouternewOuterClass();OuterClass.NestedClassnestednewOuterClass.NestedClass();nested.PrintOuterValue(outer);5.4 记录类型RecordC# 9.0不可变的数据类型简化值语义publicrecordPersonRecord(stringFirstName,stringLastName);// 使用PersonRecordp1new(Alice,Smith);PersonRecordp2p1with{LastNameJohnson};// 创建修改后的副本Console.WriteLine(p1p2);// 输出: False (值比较)5.5 结构体 vs 类特性类结构体类型引用类型值类型继承支持不支持默认构造函数必须显式定义编译器提供默认构造函数内存分配堆栈通常适用场景复杂对象小型数据结构6. 完整示例usingSystem;namespaceClassDemo{// 定义一个完整的类publicclassStudent{// 字段privatestringname;privateintage;privatereadonlystringstudentId;// 只读字段只能在构造函数中设置// 自动实现的属性publicdoubleGPA{get;privateset;}// 带验证的属性privatestring_major;publicstringMajor{get_major;set{if(!string.IsNullOrWhiteSpace(value)){_majorvalue;}else{Console.WriteLine(Invalid major specified!);}}}// 构造函数publicStudent(stringname,intage,stringstudentId){this.namename;this.ageage;this.studentIdstudentId;this.GPA0.0;this.MajorUndeclared;}// 实例方法publicvoidUpdateGPA(doublenewGrade){// 简化计算实际应考虑学分权重GPA(GPA*(CoursesTaken-1)newGrade)/CoursesTaken;}// 只读属性计算属性publicintCoursesTaken{get;}0;// 静态成员publicstaticintTotalStudents{get;privateset;}0;publicStudent():this(Unknown,18,GenerateStudentId()){TotalStudents;}// 静态构造函数初始化静态成员staticStudent(){Console.WriteLine(Student class initialized);}// 静态方法privatestaticstringGenerateStudentId(){return$STU{DateTime.Now.Ticks%100000:D5};}// 方法重载publicvoidEnroll(stringcourseName){Console.WriteLine(${name}enrolled in{courseName});}publicvoidEnroll(stringcourseName,intcredits){Console.WriteLine(${name}enrolled in{courseName}({credits}credits));}// 对象方法publicoverridestringToString(){return${name}(ID:{studentId}), Age:{age}, Major:{Major}, GPA:{GPA:F2};}}classProgram{staticvoidMain(string[]args){// 创建实例StudentalicenewStudent(Alice,20,STU00123);StudentbobnewStudent();// 使用默认构造函数// 访问成员alice.MajorComputer Science;alice.UpdateGPA(3.5);alice.Enroll(C# Programming,4);bob.Major;// 会触发验证bob.MajorMathematics;bob.UpdateGPA(3.8);bob.Enroll(Advanced Calculus);// 输出信息Console.WriteLine(alice);Console.WriteLine(bob);Console.WriteLine($Total students:{Student.TotalStudents});}}}7. 最佳实践封装性将字段设为private通过属性暴露不可变性考虑使用readonly字段或记录类型命名规范类名使用 PascalCase方法名使用 PascalCase单一职责每个类应该只有一个明确的职责构造函数初始化确保对象在创建后处于有效状态文档注释使用 XML 注释说明公共成员避免过度设计从简单类开始根据需要添加复杂性