随便玩玩之C# 17 数据类型:类
随便玩玩之C# 17 数据类型:类
基本数据类型只能一个变量存一个数据。
生活中经常有各类打包的数据,比如学生的成绩有数学、英语、语文等各个科目的。学生的体质评测有身高、体重等。这种打包的数据可以用类这个类型来做个模板,需要的数据就往里面填数据。
当然,类,不仅仅用来存数据。这一节只说一下存数据的事情。其他的后面再说。类里面有方法、有属性、有变量,类可以继承等等。
先定义一个类:
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.ReadKey(); } } // 这是我们自定义的类。 public class Student { } }
面向对象语言里一切皆对象。所谓对象就是按照类这个模板生成的对象实例。Main()方法就位于一个Program
类中。
第6-14行是一个类,类的名称是Program
第17-20行是一个类,类的名称是Student
类的声明标识符是class,定义格式是后面带一对大括号。
我们往类里面添加一些属性。属性用来保存数据
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.ReadKey(); } } // 这是我们自定义的类。 // 定义了5个属性,分别是学号,姓名,语文,英语,数学成绩。 public class Student { public int Id { get; set; } public string Name { get; set; } public int Chinese { get;set; } public int English { get; set; } public int Math { get; set; } } }
给类定义了五个属性。现在这个类只是一个蓝图,是一个模板。要实例化成对象才能被调用。
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { // 实例化对象,现在对象类实例化了,但是没有数据。 Student StudentResult = new Student(); Console.ReadKey(); } } // 这是我们自定义的类。 // 定义了5个属性,分别是学号,姓名,语文,英语,数学成绩。 public class Student { public int Id { get; set; } public string Name { get; set; } public int Chinese { get;set; } public int English { get; set; } public int Math { get; set; } } }
在实例化对象那一句中,Student表示声明一个刚刚定义的类的类型的数据(用刚刚的那个定义的模板的数据格式定义一个数据类型),StudentResult是实例化的对象名称。new表示用Student模板实例化一个对象,Student()表示所使用的类(模板)。
如何往对象里面添加数据呢?
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { // 实例化对象,现在对象类实例化了,但是没有数据。 Student StudentResult = new Student (); StudentResult.Id = 2; StudentResult.Name = "张三"; StudentResult.Chinese = 80; StudentResult.Math = 90; Console.WriteLine("学号:{0}",StudentResult.Id); Console.WriteLine("姓名:{0}", StudentResult.Name); Console.WriteLine("语文:{0}", StudentResult.Chinese); Console.WriteLine("数学:{0}", StudentResult.Math); Console.WriteLine("英语:{0}", StudentResult.English); Console.ReadKey(); } } // 这是我们自定义的类。 // 定义了5个属性,分别是学号,姓名,语文,英语,数学成绩。 public class Student { public int Id { get; set; } public string Name { get; set; } public int Chinese { get;set; } public int English { get; set; } public int Math { get; set; } } }
对象实例化后,对象的属性可以用对象名称加点加属性名称来调用。
StudentResult.Name
之后就可像基本数据类型一样进行赋值。
StudentResult.Name = "张三";
之后可以像基本数据类型一样进行调用。
Console.WriteLine("姓名:{0}", StudentResult.Name);
上面代码中没有给英语成绩的属性赋值,为什么输出是0呢。因为对象的初始化就是这样的。对象的初始化由类的构造负责。
上面代码,使用Student类这个模板实例化了张三的成绩这个对象。也就是给他的成绩打了个包。那么如何打包使用这些数据呢。
可以定义一个函数来处理这一包数据,把对象当作参数传递。声明方法时传入的参数用的是类,因为类在任何时候都存在。调用方法时,传入的是实参,是对象。
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { // 实例化对象,现在对象类实例化了,但是没有数据。 Student StudentResult = new Student (); StudentResult.Id = 2; StudentResult.Name = "张三"; StudentResult.Chinese = 80; StudentResult.Math = 90; PrintResult (StudentResult); Console.ReadKey(); } // 声明一个打印成绩的方法 // 方法不返回值,只是处理一些数据 // 方法的名称叫做PrintResult // 传入的数据类型是Student // 传入数据的形参是student,和传入数据类型Student只有一个字母的差别。 // 但是代表的含义不同,一个是类型,一个是参数 static void PrintResult(Student student) { Console.WriteLine(student.Id); Console.WriteLine(student.Name); Console.WriteLine(student.Chinese); Console.WriteLine(student.Math); Console.WriteLine(student.English); Console.WriteLine(student.Math); } } // 这是我们自定义的类。 // 定义了5个属性,分别是学号,姓名,语文,英语,数学成绩。 public class Student { public int Id { get; set; } public string Name { get; set; } public int Chinese { get;set; } public int English { get; set; } public int Math { get; set; } } }
第28-36行声明了一个方法,传入了类,按照模板处理一些数据。第17行调用了这个方法,传入了实例化的对象。
其他:
为什么Student()后要带上一对括号呢。这段代码中没有Student()这个方法函数啊。
是因为类在实例化过程中自动创建了一个构造函数和析构函数,构造函数就是实例化是第一个执行的方法函数,析构函数就是类的实例被销毁是执行的方法函数。就像启动车子,肯定是各种仪表盘都先转一转,车子熄火时仪表盘的指针肯定要回到原位。
构造函数可以有执行代码,也可以没有代码。
加上构造函数和析构函数,更清晰明了。
using System; namespace DataTypes_Class { // 这是一个类。C#语言自动生成的。 public class Program { static void Main(string[] args) { // 实例化对象,现在对象类实例化了,但是没有数据。 Student StudentResult = new Student (); Console.ReadKey(); } } // 这是我们自定义的类。 // 定义了5个属性,分别是学号,姓名,语文,英语,数学成绩。 public class Student { public int Id { get; set; } public string Name { get; set; } public int Chinese { get;set; } public int English { get; set; } public int Math { get; set; } // 构造函数和析构函数与类同名,只不过析构函数前要加一个波浪号。 // 一定要和类同名,不同名的就不是构造函数和析构函数。 // 构造函数,即使不声明构造函数,C#依然会有一个构造函数。 public Student() { } //析构函数 ~Student() { } } }