最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#類中方法的執(zhí)行順序是什么

 更新時(shí)間:2021年05月26日 16:01:16   作者:犁痕  
有些中級(jí)開發(fā)小伙伴還是搞不太明白在繼承父類以及不同場(chǎng)景實(shí)例化的情況下,父類和子類的各種方法的執(zhí)行順序到底是什么,本文就來介紹一下

有些中級(jí)開發(fā)小伙伴還是搞不太明白在繼承父類以及不同場(chǎng)景實(shí)例化的情況下,父類和子類的各種方法的執(zhí)行順序到底是什么,下面通過場(chǎng)景的舉例來重新認(rèn)識(shí)下方法的執(zhí)行順序:

(下面內(nèi)容涉及到了C#中的繼承,構(gòu)造函數(shù),虛方法,虛方法的重寫,new關(guān)鍵字等知識(shí)點(diǎn))

場(chǎng)景一

有子類繼承,但是只實(shí)例化父類:只執(zhí)行A對(duì)象,輸出A對(duì)象的信息

class A
{     
    public A() => Console.WriteLine("A的構(gòu)造函數(shù)");    
    public virtual void Fun() => Console.WriteLine("A的方法");    
}
class B : A
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");    
    public void Fun() => Console.WriteLine("B的方法");    
}
class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Fun();
        Console.ReadLine();
    }
}

上述Main方法中在new A對(duì)象時(shí),程序首先進(jìn)入class A中,執(zhí)行class A的構(gòu)造函數(shù)A(),然后執(zhí)行class A中的Fun()方法,故運(yùn)行結(jié)果為:

場(chǎng)景二

實(shí)例化子類,子類和父類的構(gòu)造函數(shù)的執(zhí)行順序:當(dāng)執(zhí)行B對(duì)象時(shí),因?yàn)槔^承A對(duì)象,所以首先執(zhí)行基類A的構(gòu)造函數(shù)

class A
{   
    public A() => Console.WriteLine("A的構(gòu)造函數(shù)");    
    public virtual void Fun()=>  Console.WriteLine("A的方法");    
}
class B : A
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");   
    public void Fun() => Console.WriteLine("B的方法");    
}
class Program
{
    static void Main(string[] args)
    {
        B b = new B(); 
        b.Fun();
        Console.ReadKey();
    }
}

上述Main方法中在new B對(duì)象時(shí),由于B繼承A,先執(zhí)行父類的構(gòu)造函數(shù),所以先執(zhí)行A中的構(gòu)造函數(shù)A(),然后在執(zhí)行B中的構(gòu)造函數(shù)B(),故運(yùn)行結(jié)果為:

場(chǎng)景三

父類有虛方法,子類沒有使用(override)關(guān)鍵字重寫父類方法的時(shí)候,使用的是new關(guān)鍵字時(shí):

class A
{   
    public A()=>  Console.WriteLine("A的構(gòu)造函數(shù)");   
    public virtual void Fun() => Console.WriteLine("A的方法");
    
}
class B : A
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");    
    //不寫new時(shí),該方法會(huì)拋出警告,但不是錯(cuò)誤
    public new void Fun()=> Console.WriteLine("B的方法");    
}
class Program
{
    static void Main(string[] args)
    {
        A a = new B();
        a.Fun();
        Console.ReadKey();
    }
}

上述Main方法中先new B對(duì)象,先執(zhí)行A中的構(gòu)造函數(shù)A(),然后在執(zhí)行B中的構(gòu)造函數(shù)B(),最后調(diào)用class A的Fun()方法(沒有重寫父類方法),故運(yùn)行結(jié)果為:

場(chǎng)景四

父類有虛方法, 當(dāng)子類重寫了(override)父類的方法時(shí):

class A
{
    public A()=> Console.WriteLine("A的構(gòu)造函數(shù)");    
    public virtual void Fun() =>  Console.WriteLine("A的方法");    
}
class B : A
{
    public B()=> Console.WriteLine("B的構(gòu)造函數(shù)");    
    public override void Fun()=> Console.WriteLine("B的方法");    
}
static void Main(string[] args)
{
    A a = new B();
    a.Fun();
    Console.ReadKey();
}

上述Main方法同樣是先new B對(duì)象,先執(zhí)行A中的構(gòu)造函數(shù)A(),然后在執(zhí)行B中的構(gòu)造函數(shù)B(),但是子方法中使用了override關(guān)鍵字“覆蓋”,使得子類中方法覆蓋了父類中的方法,無法再訪問父類中原始方法。(要重寫方法,父類方法必須有virtual關(guān)鍵字),所以其運(yùn)行結(jié)果為:

場(chǎng)景五

基類是接口層,多重繼承時(shí):

interface I
{
    void Fun();
}
class A : I
{
    public A() => Console.WriteLine("A的構(gòu)造函數(shù)");
    public virtual void Fun() => Console.WriteLine("A的方法");
}
class B : A
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");
    //不寫new時(shí),該方法會(huì)拋出警告
    public new void Fun() =>Console.WriteLine("B的方法");   
}
static void Main(string[] args)
{
    B b = new B();
    b.Fun();
    ((A)b).Fun();
    ((I)b).Fun();
    Console.ReadKey();
}

打印結(jié)果:

場(chǎng)景六

當(dāng)多重繼承,子類重寫override父類方法時(shí):

interface I
{
    void Fun();
}

class A : I
{
    public A() => Console.WriteLine("A的構(gòu)造函數(shù)");
    public virtual void Fun() => Console.WriteLine("A的方法");

}
class B : A
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");    
    public override void Fun() =>Console.WriteLine("B的方法");   
}
static void Main(string[] args)
{
    B b = new B();
    b.Fun();
    ((A)b).Fun();
    ((I)b).Fun();
    Console.ReadKey();
}

打印結(jié)果:(對(duì)比場(chǎng)景5)

場(chǎng)景七

使用new重寫父類方法,同時(shí)讓每個(gè)子類都繼承接口:

interface I
{
    void Fun();
}

class A : I
{
    public A() => Console.WriteLine("A的構(gòu)造函數(shù)");
    public virtual void Fun() => Console.WriteLine("A的方法");

}
class B : A, I
{
    public B() => Console.WriteLine("B的構(gòu)造函數(shù)");
    //不寫new時(shí),該方法會(huì)拋出警告
    public new void Fun() => Console.WriteLine("B的方法");
}
static void Main(string[] args)
{
    B b = new B();
    b.Fun();
    ((A)b).Fun();
    ((I)b).Fun();
    Console.ReadKey();
}

打印結(jié)果:

到此這篇關(guān)于C#類中方法的執(zhí)行順序是什么的文章就介紹到這了,更多相關(guān)C#類中方法的執(zhí)行順序 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中 Json 序列化去掉null值的方法

    C#中 Json 序列化去掉null值的方法

    要將一個(gè)對(duì)象序列化,可是如果對(duì)象的屬性為null的時(shí)候,我們想將屬性為null的都去掉,怎么處理呢?其實(shí)方法很簡(jiǎn)單的,下面就跟隨腳本之家小編一起學(xué)習(xí)C#中 Json 序列化去掉null值的方法吧
    2017-09-09
  • C#中內(nèi)聯(lián)函數(shù)的用法介紹

    C#中內(nèi)聯(lián)函數(shù)的用法介紹

    這篇文章介紹了C#中內(nèi)聯(lián)函數(shù)的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入

    UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入

    這篇文章主要為大家詳細(xì)介紹了UGUI實(shí)現(xiàn)4位驗(yàn)證碼輸入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C#中的協(xié)變與逆變小結(jié)

    C#中的協(xié)變與逆變小結(jié)

    這篇文章主要介紹了C#中的協(xié)變與逆變的相關(guān)知識(shí),在泛型或委托中,如果不使用協(xié)變或逆變,那么泛型類型是一個(gè)固定類型,而使用協(xié)變或逆變的話,則泛型類型可以實(shí)現(xiàn)多態(tài)化,需要的朋友可以參考下
    2021-10-10
  • 基于Unity實(shí)現(xiàn)2D邊緣檢測(cè)

    基于Unity實(shí)現(xiàn)2D邊緣檢測(cè)

    這篇文章主要介紹了如何利用Unity實(shí)現(xiàn)2D邊緣檢測(cè),從而達(dá)到人物描邊效果。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • C#中結(jié)構(gòu)體定義并轉(zhuǎn)換字節(jié)數(shù)組詳解

    C#中結(jié)構(gòu)體定義并轉(zhuǎn)換字節(jié)數(shù)組詳解

    在寫C#TCP通信程序時(shí),發(fā)送數(shù)據(jù)時(shí),只能發(fā)送byte數(shù)組,處理起來比較麻煩不說,如果是和VC6.0等寫的程序通信的話,很多的都是傳送結(jié)構(gòu)體,在VC6.0中可以很方便的把一個(gè)char[]數(shù)組轉(zhuǎn)換為一個(gè)結(jié)構(gòu)體,而在C#卻不能直接把byte數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,要在C#中發(fā)送結(jié)構(gòu)體,應(yīng)該怎么做呢?
    2017-11-11
  • C#中Path類的使用方法

    C#中Path類的使用方法

    這篇文章主要介紹了C#中Path類的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C# winform程序讀取文本中的值實(shí)例講解

    C# winform程序讀取文本中的值實(shí)例講解

    在本篇文章中小編給大家分享了關(guān)于C# winform程序讀取文本中的值的相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。
    2019-06-06
  • C#中的Image控件用法詳解與實(shí)際應(yīng)用示例

    C#中的Image控件用法詳解與實(shí)際應(yīng)用示例

    在C#應(yīng)用程序開發(fā)中,圖像顯示是一個(gè)常見的需求,無論是創(chuàng)建圖形界面還是處理圖像數(shù)據(jù),System.Windows.Controls.Image控件都是實(shí)現(xiàn)這一目標(biāo)的重要工具,本文將詳細(xì)介紹Image控件的功能、用法、優(yōu)化技巧以及一些實(shí)際應(yīng)用示例,需要的朋友可以參考下
    2024-06-06
  • Unity C#打包AssetBundle與場(chǎng)景詳解

    Unity C#打包AssetBundle與場(chǎng)景詳解

    這篇文章主要給大家介紹了關(guān)于Unity C#打包AssetBundle與場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論

富平县| 历史| 时尚| 宜都市| 长乐市| 公安县| 杨浦区| 扬州市| 台北县| 定结县| 崇文区| 永善县| 镇远县| 永善县| 武隆县| 福泉市| 上栗县| 冀州市| 紫阳县| 沙坪坝区| 新和县| 买车| 宁城县| 师宗县| 疏附县| 车致| 庐江县| 八宿县| 东海县| 浦县| 东乌珠穆沁旗| 彰武县| 江山市| 涞水县| 托里县| 乐业县| 黄浦区| 武功县| 汉寿县| 普陀区| 麻阳|