1. 程式人生 > >C# 構造器總結

C# 構造器總結

實例 否則 私有 null 並且 們的 intern col type類

在C#中,構造器分為實例構造器和類型構造器,

一、實例構造器

構造引用類型的對象時,在調用實例 構造器之前,為對象分配的內存總是歸0,沒有被構造器顯示重寫的字段都保證獲得0或null的值

在一個類中,如果我們沒有顯示的定義任何構造器,那麽C#編譯器將定義一個默認的無參構造器,這個無參構造器會簡單的調用一個基類的無參構造器,如下面SomeType類

public class SomeType
    {
        public SomeType() : base() { }
    }

但是當我們基類中沒有提供無參構造器怎麽辦呢,那麽這時我們的派生類就必需顯示的調用一個基類的構造器,否則編譯器會報錯。如果類的修飾符為static,編譯器根本不會在類的定義中生成默認構造器。

在一個類型中我們是可以定義多個實例構造器的,但是每個構造器必須有不同的簽名。

接下來我們再來談談實例構造器的執行,請看如下代碼:

internal sealed class SomeType
    {
        private int m_x = 5;
    }

當我們構造SomeType類時,它的m_x字段被初始化為5,這是因為SomeType的構造器把5存儲到字段m_x,再調用基類的構造器,最後調用了自己的構造器。如果你還不懂,請看下面這段代碼:

internal sealed class SomeType
    {
        
private int m_x = 5; private double m_d = 3.1415;
private byte m_b;
public SomeType(string s) { m_d = 10; } }

當我們實例化類型時調用了SomeType(string s)這個構造器時,編譯器生成的代碼首先會初始化m_x、m_b和m_d的值,再調用基類的構造器,這裏的基類就是object,最後再執自己的代碼,所以最後三個字段的值為m_x = 5,m_d =10,m_b

=0;

說完了引用類型的實例構造器,我們再來談談值類型的構造器,個人認為值類型的構造器沒有這麽重要,只要記得幾點就行:

1、CLR確實允許為值類型定義構造器,可以調用構造器來初始化值類型的字段,但必須顯示調用才會執行。

2、C#編譯器不允許值類型定義無參構造器,但是CLR允許,也就是說,我們可以使用另一種語言定義帶有無參構造器的值類型。

二、類型構造器

除了實例構造器,CLR還支持類型構造器,也叫靜態構造器、類構造器或者類型初始化器。

1、類型構造器默認沒有定義,如果要定義,只能定義一個

2、類型構造器永遠沒有參數

3、必須標記為static,這也是它與實例構造器的區別

4、C#自動將其標為私有,用顯示標記,否則會報錯,之所以私有,是為了防止開發人員調用它,因為它的調用是CLR負責的。

5、類型構造器中的代碼只能訪問類型的靜態字段,並且它的常規用途就是初始化這些字段。

C# 構造器總結