程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#對象初始化次序實例剖析

c#對象初始化次序實例剖析

編輯:C#入門知識

c#對象初始化次序實例剖析。本站提示廣大學習愛好者:(c#對象初始化次序實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是c#對象初始化次序實例剖析正文


本文實例剖析了c#對象初始化次序。分享給年夜家供年夜家參考。詳細以下:

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      A a = new B();
      Console.ReadLine();
    }
  }
  class A {
    //挪用到這個結構函數時:x=1,y=0
    public A() {
      //該函數在B類中被重載,是以輸入 x=1,y=0
      Console.WriteLine("在A類的結構函數中");
      PrintFields();
    }
    public virtual void PrintFields() { }
  }
  class B : A {
    //派生類變量/靜態成員的履行次序優於基類
    //先變量,是以,x=1,y=0
    int x = 1;
    int y;
    //後結構函數,此時,先挪用基類結構函數
    public B() {
      //運轉到這裡時,A類結構函數曾經履行終了
      y = -1;
      Console.WriteLine("在B類的結構函數中");
      //此時 x=1,y=-1
      PrintFields();
    }
    public override void PrintFields() {
      Console.WriteLine("x={0},y={1}", x, y);
    }
  }
}

這裡備忘一下c#對象初始化次序及C++對象初始化次序:

C#對象初始化

1. 先變量後結構函數。變量先被初始化,然後結構函數被履行

2. 先靜態化後實例化。當一個類被拜訪時,靜態變量和結構函數最早被初始化.接著是對象的實例化變量和結構函數被初始化

3. 先派生類後基類。關於變量和靜態結構函數,派生對象在基對象之前被初始化.好比C類派生自B類,B類派生自A類,那末變量和靜態結構函數被初始化順序是C-B-A.

4. 除實例結構函數。關於實例結構函數,基類結構函數在派生類結構函數之前履行,實例結構函數被履行順序是A-B-C.

5. 不要假定變量的順序。Fields根據它們在源文件中的聲明的次序順次初始化.但是,自從法式員和對象可以隨便支配變量的聲明後,你不該該在依附變量任何特殊的順序初始化

6. 對虛辦法用兩個階段的構建。防止從一個結構器挪用虛辦法. 假如在初始化一個對象時須要挪用一些虛辦法,應在完全結構該對象的處所應用兩階段的構建,並隨後挪用已結構對象的初始化辦法。

C++結構函數挪用次序

1. 假如類外面有成員類,成員類的結構函數優先被挪用;

2. 創立派生類的對象,基類的結構函數優先被挪用(也優先於派生類裡的成員類);

3. 基類結構函數假如有多個基類,則結構函數的挪用次序是某類在類派生表中湧現的次序而不是它們在成員初始化表中的次序;

4. 成員類對象結構函數假如有多個成員類對象,則結構函數的挪用次序是對象在類中被聲明的次序而不是它們湧現在成員初始化表中的次序;

5. 派生類結構函數,作為普通規矩派生類結構函數應當不克不及直接向一個基類數據成員賦值而是把值傳遞給恰當的基類結構函數,不然兩個類的完成釀成緊耦合的(tightly coupled)將加倍難於准確地修正或擴大基類的完成。(基類設計者的義務是供給一組恰當的基類結構函數)

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved