一、原理:
建構函式一般用來初始化對像的. 和類同名;
解構函式是銷毀對像佔用的資源的 ,在類名前一個 “ ~ ”
當對象被建立時,建構函式被自動執行。當對象消亡時,解構函式被自動執行。
一個簡單的執行個體:
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類的解構函式!
總結:程式執行時,對於靜態建構函式:先執行自己的靜態建構函式再執行父類的建構函式,
執行執行個體建構函式時,先執行父類的執行個體建構函式,再執行自己的執行個體建構函式