自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析關于實例化順序的C#面試題

開發(fā) 后端
面試題從很大程度上會反映一個公司的業(yè)務水平,今天我們將談到的是一道關于實例化順序的C#面試題。

最近找工作,面試了幾家公司,其中有一家公司的面試題給我印象很深,不久前在博客園看過類似的題目,但這次的更復雜,題目如下:

  1. public class BaseA  
  2. {  
  3.     public static MyTest a1 = new MyTest("a1");  
  4.     public MyTest a2 = new MyTest("a2");  
  5.     static BaseA()  
  6.    {  
  7.         MyTest a3 = new MyTest("a3");  
  8.     }  
  9.     public BaseA()  
  10.     {  
  11.         MyTest a4 = new MyTest("a4");  
  12.     }  
  13.     public virtual void MyFun()  
  14.     {  
  15.         MyTest a5 = new MyTest("a5");  
  16.     }  
  17. }  
  18.  
  19. public class BaseB : BaseA  
  20. {  
  21.     public static MyTest b1 = new MyTest("b1");  
  22.     public MyTest b2 = new MyTest("b2");  
  23.     static BaseB()  
  24.    {  
  25.         MyTest b3 = new MyTest("b3");  
  26.     }  
  27.     public BaseB()  
  28.     {  
  29.         MyTest b4 = new MyTest("b4");  
  30.     }  
  31.  
  32.     public new void MyFun()  
  33.     {  
  34.         MyTest b5 = new MyTest("b5");  
  35.     }  
  36. }  
  37.  
  38. static class Program  
  39. {  
  40.     static void Main()  
  41.     {  
  42.         BaseB baseb = new BaseB();  
  43.         baseb.MyFun();  
  44.     }  
  45. }  
  46. public class MyTest  
  47. {  
  48.     public MyTest(string info)  
  49.     {  
  50.         Console.WriteLine(info);  
  51.     }  

最后的問題是:請寫出Main()方法中,a1-a5,b1-b5這十個類實例化的順序。(MyTest類是我自己添的,方便查看結果,原題是是實例化一個object類。)

不知道園子里有多少人能胸有成竹的寫出正確答案,反正我是答錯了,正確答案是:

b1
b3
b2
a1
a3
a2
a4
b4
b5

題目中涉及到的知識點

雖然題目沒做對了,但要知道自己為什么會做錯,這樣才會有所提高,趁著端午的假期,我把這個面試題涉及到的知識點都梳理了一遍,要點如下

內聯(lián)(inline)方式初始化字段。

類型構造器(靜態(tài)構造函數)的執(zhí)行時間。

C#中基類和子類實例化的順序。

new修飾符的作用。

內聯(lián)方式初始化字段

這個知識點在《CLR via C#》書中有講到,所謂內聯(lián)方式,就是初始化字段的一種簡化語法。來看示例代碼:

  1. public class SomeType  
  2. {  
  3.     public int m_x = 5;  

這種在類中聲明變量時進行賦值的方式就叫做內聯(lián),大致等效于下面的代碼:

  1. public class SomeType  
  2. {  
  3.     public int m_x;  
  4.     public SomeType()  
  5.     {  
  6.         m_x = 5;  
  7.     }  

之所以說“大致等效”,因為兩者的執(zhí)行順序上略有差異,編譯器會首先生成內聯(lián)方式的代碼,然后再調用構造函數。

比如,下面的代碼,最后m_x的結果就為10。

  1. public class SomeType  
  2. {  
  3.     //先執(zhí)行  
  4.     public int m_x=5;  
  5.     public SomeType()  
  6.     {  
  7.         //后執(zhí)行  
  8.         m_x = 10;  
  9.     }  

類型構造器的執(zhí)行

所謂類型構造器也就是我們熟知的靜態(tài)構造方法,在我們編寫的類中,都會有一個默認的靜態(tài)無參構造方法,跟無參實例構造方法一樣是默認存在的。

每當我們對一個類創(chuàng)建第一個實例或訪問靜態(tài)字段前,JIT編譯器就會調用該類的靜態(tài)構造方法。當然,靜態(tài)變量也可以使用上面說的內聯(lián)方法進行賦值。

這里可以看出,當第一次實例化某個類時,會首先調用該類的靜態(tài)構造方法。

C#中基類和子類實例化的順序

這個知識點比較簡單,那就是在調用子類實例構造方法之前會調用基類的實例構造方法。從面試題的結果可以看出,基類的構造方法又比子類的靜態(tài)構造函數晚一些,此處因個人能力有限,我也沒辦法從更底層的角度去分析原理,只能暫且記住吧。

new修飾符的作用

我看過不少關于new以修飾符的形式用在方法聲明中的題目,關于new的用法在MSDN上也都查的到,官方說法是“顯式隱藏從基類繼承的成員”。

我個人的理解比較簡單:當子類中,一個方法的簽名(指參數,方法名,返回值)與基類的一個方法相同,通過加入new修飾符,可以讓子類不做更改的去使用該方法。

說到底,new修飾符就是讓兩個不相關的同名方法同時存在而已。(這里同名指相同的方法簽名)

最后

回頭想想,其實在我日常的項目開發(fā)中,多多少少都有涉及到這幾個問題,只是平時不注意,沒有深究吃透,寫此文也是勉勵自己以后要重視基礎,不再浮躁。

原文鏈接:http://www.cnblogs.com/hkncd/archive/2011/06/05/2073404.html

【編輯推薦】

  1. C#簡單游戲外掛制作(以Warcraft Ⅲ為例)
  2. C#控件的閃爍問題解決方法總結
  3. 淺析C#延遲加載的運行機制和應用場景
  4. C#多線程中l(wèi)ock的用法
  5. 用C#實現HTTP協(xié)議下的多線程文件傳輸
責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2009-08-11 15:09:44

一道面試題C#算法

2009-06-02 15:30:35

Hibernate面試筆試題

2014-12-02 10:02:30

2009-08-28 11:09:35

C#數組初始化

2024-11-28 08:33:16

JavaScrip事件循環(huán)this

2009-08-31 17:30:10

C#接口的作用

2009-09-09 14:40:15

C# XML解析

2009-08-31 17:16:12

C#實現接口

2009-08-27 17:40:21

C#接口的作用

2022-05-08 19:58:10

JSONPJavaScript

2009-08-26 12:14:44

C#打印設置

2009-09-07 06:31:32

C#窗體移動

2009-08-19 16:09:15

C#操作Access

2009-08-31 18:17:32

C#接口編程

2009-09-09 13:57:28

C# XML解析

2009-08-18 10:47:40

C#枚舉類型

2025-03-20 07:54:57

2009-08-28 15:37:22

C#線程類的定義
點贊
收藏

51CTO技術棧公眾號