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

C#之类型与实例

C# 类与实例教程:从基础到高级应用

类是 C# 面向对象编程的核心概念,它允许我们创建自定义类型,封装数据和行为。

1. 类的基本概念

1.1 什么是类?

类是创建对象的蓝图或模板,它定义了对象的:

  • 数据(字段/属性):对象的状态
  • 行为(方法):对象可以执行的操作
  • 事件:对象可以响应的通知
  • 嵌套类型:类中定义的其他类、结构体等

1.2 简单类示例

// 定义一个简单的 Person 类publicclassPerson{// 字段(数据成员)privatestringname;privateintage;// 构造函数publicPerson(stringname,intage){this.name=name;this.age=age;}// 方法(行为)publicvoidIntroduce(){Console.WriteLine($"Hello, my name is{name}and I'm{age}years old.");}}

2. 创建实例(对象)

2.1 实例化类

使用new关键字创建类的实例:

// 创建 Person 类的实例Personperson1=newPerson("Alice",30);Personperson2=newPerson("Bob",25);// 调用方法person1.Introduce();// 输出: Hello, my name is Alice and I'm 30 years old.person2.Introduce();// 输出: Hello, my name is Bob and I'm 25 years old.

2.2 对象生命周期

  1. 实例化:分配内存并调用构造函数
  2. 使用:通过实例访问成员
  3. 垃圾回收:当没有引用指向对象时,GC 自动回收内存

3. 类成员详解

3.1 字段(Fields)

类的变量成员,通常声明为private

publicclassBankAccount{privatedecimalbalance;// 字段publicvoidDeposit(decimalamount){balance+=amount;}}

3.2 属性(Properties)

提供对字段的安全访问,通常包含getset访问器:

publicclassBankAccount{privatedecimalbalance;// 属性publicdecimalBalance{get{returnbalance;}privateset{balance=value;}// 限制只能在类内部设置}// 自动实现的属性(简化写法)publicstringAccountNumber{get;privateset;}publicBankAccount(stringaccountNumber){AccountNumber=accountNumber;}}

3.3 方法(Methods)

定义对象的行为:

publicclassCalculator{// 实例方法publicintAdd(inta,intb){returna+b;}// 静态方法(属于类而非实例)publicstaticdoubleSquareRoot(doublex){returnMath.Sqrt(x);}}// 使用Calculatorcalc=newCalculator();intsum=calc.Add(5,3);// 调用实例方法doubleroot=Calculator.SquareRoot(16);// 调用静态方法

3.4 构造函数(Constructors)

初始化对象状态的特殊方法:

publicclassCar{publicstringModel{get;}publicintYear{get;}// 默认构造函数publicCar(){Model="Unknown";Year=DateTime.Now.Year;}// 带参数的构造函数publicCar(stringmodel,intyear){Model=model;Year=year;}// 构造函数链publicCar(stringmodel):this(model,DateTime.Now.Year){}}

3.5 析构函数(Destructors)

(C# 中更常用IDisposable模式)

publicclassResourceHolder:IDisposable{privatebooldisposed=false;// 实现 IDisposablepublicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(booldisposing){if(!disposed){if(disposing){// 释放托管资源}// 释放非托管资源disposed=true;}}// 析构函数(备用)~ResourceHolder(){Dispose(false);}}

4. 访问修饰符

控制类成员的可访问性:

修饰符同一类同一程序集派生类其他程序集
public
private
protected
internal
protected internal✗ (除非也是派生类)

5. 高级特性

5.1 静态类

不能被实例化,只能包含静态成员:

publicstaticclassMathUtilities{publicstaticreadonlydoublePi=3.14159;publicstaticintFactorial(intn){if(n<=1)return1;returnn*Factorial(n-1);}}// 使用doublearea=MathUtilities.Pi*5*5;intfact=MathUtilities.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{privateintouterValue=10;publicclassNestedClass{publicvoidPrintOuterValue(OuterClassouter){// Console.WriteLine(outerValue); // 错误,不能直接访问Console.WriteLine(outer.outerValue);// 需要通过外部类实例访问}}}// 使用OuterClassouter=newOuterClass();OuterClass.NestedClassnested=newOuterClass.NestedClass();nested.PrintOuterValue(outer);

5.4 记录类型(Record,C# 9.0+)

不可变的数据类型,简化值语义:

publicrecordPersonRecord(stringFirstName,stringLastName);// 使用PersonRecordp1=new("Alice","Smith");PersonRecordp2=p1with{LastName="Johnson"};// 创建修改后的副本Console.WriteLine(p1==p2);// 输出: False (值比较)

5.5 结构体 vs 类

特性结构体
类型引用类型值类型
继承支持不支持
默认构造函数必须显式定义编译器提供默认构造函数
内存分配栈(通常)
适用场景复杂对象小型数据结构

6. 完整示例

usingSystem;namespaceClassDemo{// 定义一个完整的类publicclassStudent{// 字段privatestringname;privateintage;privatereadonlystringstudentId;// 只读字段,只能在构造函数中设置// 自动实现的属性publicdoubleGPA{get;privateset;}// 带验证的属性privatestring_major;publicstringMajor{get=>_major;set{if(!string.IsNullOrWhiteSpace(value)){_major=value;}else{Console.WriteLine("Invalid major specified!");}}}// 构造函数publicStudent(stringname,intage,stringstudentId){this.name=name;this.age=age;this.studentId=studentId;this.GPA=0.0;this.Major="Undeclared";}// 实例方法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){// 创建实例Studentalice=newStudent("Alice",20,"STU00123");Studentbob=newStudent();// 使用默认构造函数// 访问成员alice.Major="Computer Science";alice.UpdateGPA(3.5);alice.Enroll("C# Programming",4);bob.Major="";// 会触发验证bob.Major="Mathematics";bob.UpdateGPA(3.8);bob.Enroll("Advanced Calculus");// 输出信息Console.WriteLine(alice);Console.WriteLine(bob);Console.WriteLine($"Total students:{Student.TotalStudents}");}}}

7. 最佳实践

  1. 封装性:将字段设为private,通过属性暴露
  2. 不可变性:考虑使用readonly字段或记录类型
  3. 命名规范:类名使用 PascalCase,方法名使用 PascalCase
  4. 单一职责:每个类应该只有一个明确的职责
  5. 构造函数初始化:确保对象在创建后处于有效状态
  6. 文档注释:使用 XML 注释说明公共成员
  7. 避免过度设计:从简单类开始,根据需要添加复杂性
http://www.jsqmd.com/news/167346/

相关文章:

  • 使用Miniconda-Python3.10进行大规模Token统计分析
  • 程序员必备!一款免费的(原文/译文)AI 双语对照网页翻译插件,信息获取效率飙升!
  • 使用Miniconda创建独立环境避免PyTorch与TensorFlow版本冲突
  • 【Week2_Day5】【软件测试学习记录与反思】【坚定职业规划、数据库的了解、navicat操作、MairaDB配置、创建远程登录用户、连接服务器数据库、SQL语句练习】
  • 高效配置PyTorch环境:Miniconda与Anaconda的对比及最佳实践
  • 模拟登录验证三次机会 - GLORY-TO-THE
  • 合作文章|ChIP-seq联合RNA-seq揭示FOXS1-BSCL2轴调控胆固醇代谢与炎症的新机制
  • Miniconda环境版本控制:Git跟踪environment.yml
  • Miniconda-Python3.10镜像中配置国内镜像源的完整教程
  • 2025微前端框架全景对比
  • 吴恩达深度学习课程四:计算机视觉 第四周:卷积网络应用 (二) 图像风格转换
  • 在Miniconda中安装NLTK进行自然语言处理
  • 告别手工分析!Python+HAR一键生成页面性能测试报告
  • 数据科学与大数据技术综合设计——多源异构数据采集与融合应用综合实践小组分工_102302107林诗樾
  • Conda安装包冲突怎么办?用Miniconda-Python3.10构建隔离环境
  • HTML Canvas动态绘图:实时显示Miniconda训练指标
  • 2025.10.25-26
  • conda install pytorch torchvision torchaudio -c pytorch 完整命令解析
  • 告别“卡脖子”:国产代码大模型“万象灵码”,以智能编码助手赋能自主可控开发
  • 【扣子Coze教程】智能出题工作流,一键生成试卷(零代码)
  • 我的私密知识库探索:为什么选择了访答
  • Jupyter Book构建交互式电子书整合Miniconda教程
  • Docker diff查看Miniconda容器文件变更记录
  • GitHub Pages发布技术博客:分享Miniconda使用心得
  • Docker port查看Miniconda容器端口映射情况
  • 【技术复盘】 设备跨机迁移后的 ARP 缓存连通性故障分析
  • SSH免密登录配置:提升频繁连接Miniconda容器效率
  • 2025.10.18-19
  • Linux nice命令调整Miniconda进程优先级
  • 对抗样本攻击详解:如何让AI模型产生错误判断