【前言】
结合上一篇博客,针对当我们访问类的属性时,反复赋值,出现代码冗余的问题,这次我们引进一个新的解决办法,就是构造函数,直接传递参数就可以实现属性值的初始化。
【内容】
普通办法访问属性缺点:
当我们访问类的属性的时候,需要多次赋值,出现了冗余的代码;当我们对zsStu.Age=-88,当对写入操作没有限制的时候,就破坏了数据的完整性,并且不安全。
static void Main(string[] args){student zsStu = new student();zsStu.Name = "张三";zsStu.Age = 18;zsStu .Gender ='男';zsStu .Chinese =90;zsStu .Math =95;zsStu .English =80;zsStu .sayhello ();zsStu .score ();//冗余Console.WriteLine("==============================");student xlStu = new student();xlStu.Name = "小兰";xlStu.Age = 16;xlStu.Gender = '女';xlStu.Chinese = 95;xlStu.Math = 85;xlStu.English = 60;xlStu.sayhello();xlStu.score();Console.ReadKey();}
解决:构造函数
这时我们就要定义构造函数:构造函数就是一个方法,但方法名是类名。
作用:
通过构造函数可以避免繁琐的赋值操作,属性为只有读操作,这样保证了属性的安全很完整性,但是属性不能赋值,如何对属性操作呢?这时可以通过构造函数对属性的值进行初始化。
如何定义?
下面就是定义了一个Person类的构造函数,括号里面的是参数,把参数的值赋给字段。
namespace _03_类的构造函数
{public class Person{//Person类的构造函数public Person(string name,char gender,int age){this.name = name;//当前字段=参数.把变量的值赋值给字段this.age = age;this.gender = gender;}private string name;public string Name{get { return name; } }private char gender;public char Gender{get { return gender; } }private int age;public int Age{get { return age; } }
怎么实现属性的初始化操作?
当我们在主函数中实例化并调用这个方法的时候,会把值传递给上面的在Person类中定义的构造函数,也就是传参,然后把传递过来的值赋值给字段。
class Program{static void Main(string[] args){Person per = new Person("张三",'男',18);//利用构造函数给里面的字段赋值。per.Show();Console.ReadKey();//第一 之前那么赋值麻烦,繁琐//第二 变成只读,安全//per.Name = "张三";//只读,没那么容易赋值;该怎么赋值?//构造函数的出现,解决了赋值麻烦的问题}}
优点:
1.不会像之前那样繁锁地赋值
2.当为某个类定义了构造函数之后,这个类的属性为只读属性,通过构造函数就可以初始化该属性,这样保证了属性值得安全和完整性。
构造函数的重载:
在一个类中可以定义多个构造函数,以便提供多个不同的初始化方法,这些构造函数有相同的名字,只是参数的数目和类型不同。
下面定义了三个构造函数,只是参数不同。
public Person(string name, char gender, int age)//有参的构造函数,原来默认无参数的被覆盖了{this.name = name;//当前字段=参数.把变量的值赋值给字段this.age = age;this.gender = gender;}//想用到无参数的怎么办,构造函数的重载public Person() //无参数的构造函数{ }public Person(string name){this.name = name;}
构造函数如何使用?
在主函数中使用重载的构造函数,需要注意:对于对象来说,每个对象只执行其中一个构造函数。
class Program{static void Main(string[] args){//写一个类,如果没有写任何的构造函数,那么这个类有个默认无参数的构造函数;Person per = new Person();Person per1=new Person("张三",'男',18);Person per2 = new Person("小兰");}}
【总结】
构造函数是一种特殊的方法,没有返回值,没有void声明。直接传递参数就可以实现赋值操作,默认的是一个无参的构造函数,如果定义了一个有参的构造函数,则无参的就不在存在。如果想使用,则需要重新声明。