【C#】构造函数与析构函数
1.构造函数
类的构造函数是类的一个特殊的成员函数,当创建类的新对象时就会执行构造函数。默认的构造函数是没有任何参数的,可以重新设置无参数的构造函数,也可以为构造函数设置参数,构造函数的名称必须跟类名一样。
创建对象使用的关键字【new】实现过程:
1、在内存中开辟一块储存空间。
2、在这块空间上创建对象。
3、调用对象的析构函数进行对象的初始化。
1.默认使用构造函数。
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student();
stu1.Name = "小明";
stu1.StuId = "21002121";
stu1.ShowStudentInfo();
Console.ReadKey();
}
}
public class Student
{
// 默认构造函数,不写默认也是有函数的
// public Student()
// {
// }
// public Student(string name)
// {
// Name = name;
// }
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private string _stuId;
public string StuId
{
get
{
return _stuId;
}
set
{
_stuId = value;
}
}
public void ShowStudentInfo()
{
Console.WriteLine("姓名:{0} 学号:{1}", Name, StuId);//输出:姓名:小明 学号:21002121
}
}
2.定义多个不同形参的构造函数
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student();
//调用stu1对象的Student()析构方法
stu1.ShowStudentInfo();
//输出:姓名:大一 学号:00000001
Student stu2 = new Student("大二");
//调用stu2对象的Student(string name)析构方法
stu2.ShowStudentInfo();
//输出:姓名:大二 学号:00000002
Student stu3 = new Student("大三", "00000003");
//调用stu3对象的Student(string name, string stuId)析构方法
stu3.ShowStudentInfo();
//输出:姓名:大三 学号:00000003
Console.ReadKey();
}
}
public class Student
{
//自定义无参数的构造函数。
public Student()
{
Name = "大一";
StuId = "00000001";
}
//一个参数构造方法
public Student(string name):this(name, "00000002")
{
//为了防止代码的冗余,这里采用this的方法
//作用:调用构造函数 Student(string name, string stuId)
}
//两个参数构造方法
public Student(string name, string stuId)
{
Name = name;
StuId = stuId;
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private string _stuId;
public string StuId
{
get
{
return _stuId;
}
set
{
_stuId = value;
}
}
public void ShowStudentInfo()
{
Console.WriteLine("姓名:{0} 学号:{1}", Name, StuId);//输出:姓名:小明 学号:21002121
}
}
为了防止构造函数出现冗余现象,上述代码采用了【this】关键字解决。
【this】的两个作用:
1、代表当前类的对象,比如:this.Name = "张三";
2、在类中根据参数的不同,调用本类的构造函数。如上述代码所示。
2.析构函数
作用是释放资源 。但是在处理过程中GC机制会进行回收,因此析构函数最大的作用是提前释放资源。析构函数不能有参数,不能有任何修饰符而且不能被调用。析构函数与构造函数的标识符不同,特点是在析构函数前面需要加上前缀“~”以示区别。
class Program
{
public Program()
{
Console.WriteLine("这是无参数构造函数");
}
~Program()
{
Console.WriteLine("这是析构函数");
}
static void Main(string[] args)
{
Program pro1 = new Program();
}
}
运行结果如下:
这是无参数构造函数
这是析构函数
请按任意键继续. . .
如果系统中没有指定析构函数,那么编译器由GC(Garbage Collection,垃圾回收机制)来决定什么时候进行释放资源。
3.构造函数和析构函数的例子
为了更好理解构造函数和析构函数的执行顺序,作者编写了以下程序。
class Program
{
private string name;
public Program()
{
Console.WriteLine("这是无参数构造函数");
}
public Program(string str)
{
name = str;
Console.WriteLine("这是有参数构造函数");
}
~Program()
{
Console.WriteLine("这是" + name + "的析构函数");
}
public void SetName(string str)
{
name = str;
}
public string GetName()
{
return name;
}
static void Main(string[] args)
{
Program pro1 = new Program();
pro1.SetName("小明");
Console.WriteLine(pro1.GetName());
Program pro2 = new Program("小红");
Console.WriteLine(pro2.GetName());
}
}
运行结果如下:
这是无参数构造函数
小明
这是有参数构造函数
小红
这是小红的析构函数
这是小明的析构函数
请按任意键继续. . .
当调用完毕,系统就会自动执行析构函数,删除创建好的对象。
引用类型分两步创建,首先在栈上创建一个引用变量,然后在堆上创建对象本生,再把这个内存(也是内存的首地址)赋值给引用变量。如下图所示。所以当删除创建的对象时,实际是按照先进后出的原则进行的(先创建后删除)。所以这就是为什么会先输出“这是小红的析构函数”,再输出“这是小明的析构函数”。
因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。