C#构造函数详解和析构函数详解

首先来了解下构造函数的定义:

C#构造函数是一种特殊的成员函数,它的作用主要用于为对象分配存储空间,对数据成员进行初始化。

 

接下来看一下他的语法定义形式:

|访问修饰符| 标识符 (|参数列表|) |: base(|参数列表|)| |:this(|参数列表|)| 
{ 
   构造函数语句块; 
}

 

解释:

访问修饰符:就是我们大家所熟悉的public,private,protected,internal 这四个。

标识符:就是类名,并且必须是类名。

参数列表:就是方法或者函数的参数列表。

base:就是调用父类中的构造函数。

this:就是调用本身的其他构造函数。

 

看了上面的定义和语法形式,是不是很简单大。

 

构造函数的细则如下:

1、构造函数的名字必须和类的名字相同。

2、构造函数可以使用访问修饰符。

3、可以调用父类中的构造函数。

4、可以调用本身的其他构造函数。

5、构造函数没有返回类型,不可以有返回值。

6、构造函数可以带参数,也可以不带参数。

7、构造函数可以重载。主要是根据参数的个数不同而引起的。

8、如果不显示定义构造函数,则有默认的无参构造函数,此时构造函数的函数体是为空的。

9、静态构造函数,必须用static修饰,用于初始化静态变量。一个类中,只允许有一个构造函数。

10、如果有静态构造函数,在实例化时加载,这时修饰符就失去作用了。

11、如果定义了,有参数的构造函数,最好也显示顶一个无参的构造函数。

 

上面说了这么多,下面看一个demo

public class Base {
        public Base() {
            Console.WriteLine("爸爸的构造函数被调用啦~");
        }
    }
    public class A :Base
    {
        public A() : this("hello"){
            Console.WriteLine("我是可以调用基类和我的其他构造函数的类");
        }
        public A(string info) : base()
        {
            Console.WriteLine("我是被其他构造函数调用的,它发过来字符串"+info);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            Console.ReadLine();
        }
    }

 

 

根据上面的这个demo,输出的结果会是什么样的。这里就引起了另外一个问题。那就是子类本身和父类构造函数的构造顺序是怎么样执行的。

我们来分析一下:

 

首先调用构造函数A()
然后呢,因为A()使用了this关键字,所以在还没有进入函数体的是否就调用了this("hello")也就是A(string info)
这时候A(string info)构造函数被调用,但是由于该构造函数使用了base关键字,所以在没有进入函数体就去调用它爸爸构造函数Base()咯
然后调用完Base()就依次的输出结果咯,整个过程其实就是一个压栈然后取栈顶元素的过程

分析过之后,上面的执行结果就是:

爸爸的构造函数被调用啦~ 
我是被其他构造函数调用的,它发过来字符串hello 
我是可以调用基类和我的其他构造函数的类

 

 

  接下类我们在学习一下 析构函数的用法:

析构函数的作用:垃圾回收器,它用来清理对象时调用
析构函数的细则:

1、不能有参数

2、不能有任何修饰符而且不能被调用,它是自动调用的,这是它与构造函数的一个主要区别。

3、由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。

 

 

接下来我们先看下析构函数的用法:
public class Base {
        public Base() {
            Console.WriteLine("爸爸的构造函数被调用啦~");
        }
     ~Base()
    {
      Console.WriteLine("我是析构函数 Base");  
    }

    }
    public class A :Base
    {
        public A() : this("hello"){
            Console.WriteLine("我是可以调用基类和我的其他构造函数的类");
        }
        public A(string info) : base()
        {
            Console.WriteLine("我是被其他构造函数调用的,它发过来字符串"+info);
        }

      ~A()
    {
      Console.WriteLine("我是析构函数A");  
    }


    }

    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            Console.ReadLine();
        }
    }

 

由于析构函数的作用也是销毁对象的。

我们和Dispose和Close方法的区别; 

说明 析构函数 Dispose Close
意义 销毁对象 销毁对象 关闭对象资源
调用方式 不能被显示调用 需要显示调用或者通过using语句调用 需要显示调用
调用时机 不确定 确定 确定

 

 

 

 

 

 》》》》》》》》》》》》》》》》》》》》》》》》》》》

 --------------------C#面向对象入门级教程--------------------------

》》》》》》》》》》》》》》》》》》》》》》》》》》》

 

posted @ 2018-07-26 16:00  温情亿度开发者  阅读(974)  评论(0编辑  收藏  举报