2016年12月16日 星期五

c# constructor 呼叫順序

在繼承關係中,constructor的呼叫順序是
1. 所有參數預設值會先被設定
class MyClass
{
int para1 = 1;...
}
因此在constructor被呼叫時,para1已經是1了
2. 最base的constructor被呼叫
3. 一層層往上呼叫
4. 最derived的最後被呼叫
5. 最後執行Object and collection initializer
(new myClass{para1 = 2; para2 = 3;...})初始會陣列就是用這個操作方式


參考資料,資料中對流程的描述更細緻,大致上是說其實是最子代的construcot先被呼叫,
但是在執行constructor的body({}中的東西)前回先跑chaining(:後面的東西)的部分

所有的class預設的constructor是
public thisClass():base()
{}
因此都會呼叫base的無參數construtor
如果base class沒有無參數的constructor(產生了其他有參數的constructor),就需要指定呼叫base constructor
例如
class BaseClass
{
    public BaseClass(int x)
    {}
}
這時候
class DerivedClass:BaseClass
{

}
的建構是若是空白就會產生找不到BaseClass()的錯誤
因此需要加入
public DerivedClass():BassClass(0)
{}
以呼叫正確的建構式
以下程式碼的結果是
>>>
init base,para Default Inited
init derived,Para default inited,para Default Inited
object and collection inited

    class Program
    {
        static void Main(string[] args)
        {
            var dc = new derivedClass() { para = "object and collection inited" };

        }
    }
    class baseClass
    {
        public string basePara = ",para Default Inited";
        public string para { set { WriteLine(value); } }
        public baseClass()
        {
            WriteLine("init base"+basePara);
        }
    }
    class derivedClass:baseClass
    {
        public string derivedPara = ",Para default inited";
        public derivedClass()
        {
            WriteLine("init derived"+derivedPara+basePara);
        }
    }

沒有留言:

張貼留言