C# 構造器總結


   在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、類型構造器中的代碼只能訪問類型的靜態字段,並且它的常規用途就是初始化這些字段。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM