【C#】构造函数与析构函数

【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());
    }
}

运行结果如下:
这是无参数构造函数
小明
这是有参数构造函数
小红
这是小红的析构函数
这是小明的析构函数
请按任意键继续. . .

当调用完毕,系统就会自动执行析构函数,删除创建好的对象。

引用类型分两步创建,首先在栈上创建一个引用变量,然后在堆上创建对象本生,再把这个内存(也是内存的首地址)赋值给引用变量。如下图所示。所以当删除创建的对象时,实际是按照先进后出的原则进行的(先创建后删除)。所以这就是为什么会先输出“这是小红的析构函数”,再输出“这是小明的析构函数”。

【C#】构造函数与析构函数_第1张图片

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

你可能感兴趣的:(C#知识模块,c#,开发语言)