C#学习笔记——构造函数与析构函数

时间:2021-12-29 00:20:34

一、原理:
        构造函数一般用来初始化对像的.   和类同名;
        析构函数是销毁对像占用的资源的   ,在类名前一个 “ ~ ”
        当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数被自动执行。
一个简单的实例:
    class   cls s
{
      public   cls(){}
      public   ~cls(){}

}

二、命名规则
     1.构造函数的名字与类同名
     2.无返回值类型(这与返回值类型为void的函数不同)
 

三、几种常用构造函数举例
    1.缺省构造函数(它由系统(CLR)提供)。
class TestClass
{
 public TestClass(): base() {} // 由CLR提供
}

    2.实例构造函数(实例构造函数是实现对类中实例进行初始化的方法成员)。如:
using System;
class Point
{
 public double x, y;
 public Point()
 {
  this.x = 0;
  this.y = 0;
 }
 public Point(double x, double y)
 {
  this.x = x;
  this.y = y;
 }
 …
}
class Test
{
 static void Main()
 {                         
  Point a = new Point();
  Point b = new Point(3, 4); // 用构造函数初始化对象
  …
 }
}

     3.静态构造函数
     静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。
     静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。


四.析构函数和垃圾回收器在C#中的运用
     析构函数是实现销毁一个类的实例的方法成员。
  析构函数不能有参数,不能任何修饰符而且不能被调用。
     由于析构函数的目的与构造函数的相反,就加前缀‘~’以示区别。
public class ResourceHolder
{

~ResourceHolder()
{
 // 这里是清理非托管资源的用户代码段
}
}


对于调用的优先顺序,实例如下:
  class Program
    {
        static void Main(string[] args)
        {
            C c = new C();
            GG.C();
        }
        public static class GG
        {
            static GG()//静态构造函数中不能有访问修饰符,默认为私有构造函数,这也是私有构造函数的用法。
            {
                Console.WriteLine("静态类GG!");
            }
            public static void C()
            {
                Console.WriteLine("静态类GG的静态方法");
            }
            /*
        ~GG()   //静态类不能包含析构函数
        {
            Console.WriteLine("静态类S的析构函数!");
        }
            
            
             */
        }
        public class A
        {
            static A()
            {
                Console.WriteLine("A类的静态构造函数!");
            }
            public  A()
            {
                Console.WriteLine("A类的实例构造函数!");
            }
            ~ A()
            {
                Console.WriteLine("A类的析构函数!");
            }
        }
        public class B:A
        {
            static B()
            {
                Console.WriteLine("B:A的静态构造函数!");
            }
            public B()
            {
                Console.WriteLine("B:A的实例构造函数!");
            }
            ~B()
            {
                Console.WriteLine("B:A的析构函数");
            }
        }
        public class C : B
        {
            static C()
            {
                Console.WriteLine("C继承B的静态构造函数!");
            }
            public C()
            {
                Console.WriteLine("静态类的静态构造函数!");
            }
           ~ C()
           {
               Console.WriteLine("C:B的构造函数! ");
           }
        }
    }

执行结果如下:

C:B类的静态构造函数!

B:A类的静态构造函数!

A类的静态构造函数!

A类的实例构造函数!

B:A类的实例构造函数!s

C:B类的实例构造函数!

静态类GG!//

静态类GG的静态方法!

C:B类的析构函数!

B:A类的析构函数!

A类的析构函数!

 

总结:程序执行时,对于静态构造函数:先执行自己的静态构造函数再执行父类的构造函数,

执行实例构造函数时,先执行父类的实例构造函数,再执行自己的实例构造函数