结构与类
- 结构和类相似,通常用来封装小型的相关变量组。
- 结构是一种值类型,通常创建结构要比创建类的速度快。如果需要一些紧凑循环,需要在其中创建大量的新数据结构,则应考虑使用结构而不是类。
- 在C#中,可以将结构看成轻量级的类。定义结构和定义类相似,采用struct进行定义,每个struct类型数据可以是常量、变量、构造函数、方法和属性等成员。
语法:
<访问修饰符> struct结构名{// 结构体定义}
使用:通过声明结构体变量或使用new来实例化结构对象,然后通过“结构体变量.结构成员名”或“结构对象.结构成员”的方式来使用结构。
示例:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace StructTest{class Program{static void Main(string[] args){Student goodStu; // 创建结构goodStu表示好学生goodStu.stuNum = \"20200409\";goodStu.stuName = \"小明\";goodStu.stuAge = 19;goodStu.stuClass = 1;goodStu.stuGrade = 100;Console.WriteLine(\"结构演示:\");Console.WriteLine(\"三好学生:学号-{0},姓名-{1},年龄-{2},班级-{3},成绩-{4}\", goodStu.stuNum, goodStu.stuName, goodStu.stuAge, goodStu.stuClass, goodStu.stuGrade);goodStu.DoHomeWork(); // 调用结构的方法Console.ReadKey();/*** 三好学生:学号-20200409,姓名-小明,年龄-19,班级-1,成绩-100* I\'m doing homework!*/Student normalStu = new Student(\"20200410\", \"小红\", 19, 1, 80);Console.WriteLine(\"普通学生:学号-{0},姓名-{1},年龄-{2},班级-{3},成绩-{4}\", normalStu.stuNum, normalStu.stuName, normalStu.stuAge, normalStu.stuClass, normalStu.stuGrade);normalStu.DoHomeWork();Console.ReadKey();/*** 普通学生:学号-20200410,姓名-小红,年龄-19,班级-1,成绩-80* I\'m doing homework!*/}}struct Student{public string stuNum; // 学号public string stuName; // 姓名public int stuAge; // 年龄public int stuClass; // 班级public int stuGrade; // 成绩public Student(string stuNum, string stuName, int stuAge, int stuClass, int stuGrade) // 结构的构造函数,用参数给结构中的成员赋值{this.stuNum = stuNum;this.stuName = stuName;this.stuAge = stuAge;this.stuClass = stuClass;this.stuGrade = stuGrade;}public void DoHomeWork() // 结构中的方法{Console.WriteLine(\"I\'m doing homework!\");}}}
结构与类的关系
类和结构实际上都是创建对象的模板,都可以包含构造函数、常数、字段、方法、属性、索引器和运算符等成员。
- 结构是值类型,类是引用类型,在内存中结构是存储在栈上的值类型,类是存储在堆(heap)上的引用类型。
- 结构的构造函数和类的构造函数不同,结构不能包含显式的无参数构造函数,结构成员会自动初始化为它们的默认值。结构不能包含以下形式的初始值设定类:base(参数列表)。
- 对于结构中的实例字段成员,不能在声明时赋值初始化。
- 声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
- 结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。
分部类
在大型项目、特殊部署时,可能需要把一个类、结构或接口放在几个文件中来处理。等到编译时,自动地把它们组合起来,成为一个完整的类,这是C# 分部类。
- 类型特别大,不宜放在一个文件中实现。
- 一个类型中的一部分代码为自动化工具生成的代码,不宜与自己编写的代码混合在一起。
- 需要多人合作编写一个类。
分部类是一个纯语言层的编译处理,不影响任何执行机制。
事实上C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。C# 分部类是在class前面添加关键字partial来定义。
分部类中还可以声明分部方法,分部方法是将方法的定义和实现分隔开。在方法前面用partial关键字修饰的方法就是分部方法。
例如,在一个文件中声明分部类Person的代码如下:
public partial class Person // 分部类Person的部分代码{public void DoWork(){// 定义方法,表示Person类的工作功能}partial void Drink(); // 定义分部方法,表示Person类的喝水功能}
在另一个文件中声明分部类Person
public partial class Person // 分部类Person的部分代码{public void HaveDinner(){// 定义方法,表示Person类的吃晚饭功能}partial void Drink(){// 实现分部方法代码}}
分部方法隐式为private类型,不可使用public访问修饰符。分部方法不可有返回值。
- 点赞
- 收藏
- 分享
- 文章举报
Yeats.NeverGiveUp发布了12 篇原创文章 · 获赞 0 · 访问量 166私信关注