news 2026/8/27 16:46:23

C#之类型与实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 避免过度设计:从简单类开始,根据需要添加复杂性
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 19:26:07

Linux显卡信息查询与排错

查看显卡情况 lspci | grep -i vga lspci | grep -E "VGA|3D|Display" 显示 04:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 41) 4b:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1) 65:00.0 …

作者头像 李华
网站建设 2026/8/21 22:08:07

Python高级技巧:利用Miniconda-Python3.10实现多项目环境隔离

Python高级技巧&#xff1a;利用Miniconda-Python3.10实现多项目环境隔离 在人工智能与数据科学的开发实践中&#xff0c;你是否曾遇到过这样的场景&#xff1f;一个刚跑通的模型&#xff0c;在换了一台机器后却因“找不到模块”或“版本不兼容”而彻底罢工&#xff1b;又或者&…

作者头像 李华
网站建设 2026/8/25 14:47:38

vue基于django教室预约管理系统

目录已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 vue基于django教室预约管理系统 …

作者头像 李华
网站建设 2026/8/22 1:47:46

使用Miniconda创建独立环境避免PyTorch与TensorFlow版本冲突

使用Miniconda创建独立环境避免PyTorch与TensorFlow版本冲突 在现代AI开发中&#xff0c;一个令人头疼的现实是&#xff1a;你刚跑通的项目&#xff0c;在同事机器上却“无法导入模块”&#xff1b;或者你想复现一篇论文代码&#xff0c;却发现它依赖的是早已被弃用的框架旧版本…

作者头像 李华
网站建设 2026/8/27 15:58:42

如何在Miniconda环境中同时安装PyTorch和Transformers库

如何在 Miniconda 环境中同时安装 PyTorch 和 Transformers 库 在当今的 AI 开发实践中&#xff0c;搭建一个稳定、可复现且高效的深度学习环境&#xff0c;几乎是每个项目的第一步。尤其是在处理自然语言任务时&#xff0c;PyTorch Transformers 已成为事实上的标准组合。然…

作者头像 李华
网站建设 2026/8/27 16:00:14

使用flit发布Python包到Miniconda环境

使用 Flit 发布 Python 包到 Miniconda 环境 在数据科学、AI 工程和自动化工具开发的日常中&#xff0c;一个常见的挑战是&#xff1a;如何快速、干净地将一个小而精的工具库发布为可复用的 Python 包&#xff0c;并确保它能在团队成员或 CI/CD 流水线中无缝安装&#xff1f;尤…

作者头像 李华