日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
大家一起探討兩道C#面試題

先看C#面試題大家可以先想想結(jié)果

C#面試題1. string aString = "a" + "b" + "c"; 有幾次內(nèi)存分配;

C#面試題2. 多態(tài)的考察,如下的輸出結(jié)果。

 
 
 
 
  1. Code  
  2. public class Program  
  3.     {  
  4.         static void Main(string[] args)  
  5.         {  
  6.             A a = new C();  
  7.             a.Show();  
  8.             Console.ReadKey();  
  9.         }  
  10.     }  
  11.     public class A  
  12.     {  
  13.         public virtual void Show()  
  14.         {  
  15.             Console.WriteLine("A");  
  16.         }  
  17.     }  
  18.     public class B:A  
  19.     {  
  20.         public new virtual void Show()  
  21.         {  
  22.             Console.WriteLine("B");  
  23.         }  
  24.     }  
  25.     public class C:B  
  26.     {  
  27.         public override void Show()  
  28.         {  
  29.             Console.WriteLine("C");  
  30.         }  
  31.     } 

我自己的答案如下

答案

我的答案是:

1次,或者沒有

A。

引入和一點分析

1 第一個問題是值類型和引用類型說起的。面試的人問我關(guān)于值類型和引用類型。我blabla說了些堆棧和內(nèi)存分配。我說了string是特殊的引用類型,他不可變。然后引出這個問題。string aString = "a" + "b" + "c"; 有幾次內(nèi)存分配。按著開始的引導(dǎo)。我的答案是a一次,b一次,ab一次。因為ab還是string不可變。那么abc還需要一次。具體不數(shù)是幾次。面試官給我的答案也是很多次。他也是這么認(rèn)為的。

回來之后我寫了這個代碼??戳讼翴L發(fā)現(xiàn)不是這么回事。CLR可以直接生成字符串"abc".

后來請教高人,多少明白是怎么個意思了。因為+的含義編譯器是知道的就是編譯器知道string不可變,所以提前在生成的IL代碼里面寫死了,寫在數(shù)據(jù)段里面了,等同于寫死了。如果編譯器比較先進(jìn)的話他能檢測到aString也不需要內(nèi)存。

  1. 2 看IL

  

IL中也是非常的清楚的現(xiàn)實了調(diào)用的是A中的Show方法。我的理解是:

A定義了方法show,注意B中的show方法雖然也是virtual的,但是之前有一個new。B從新定義了一個方法show。

C 中的override的是B定義的那個方法。

【這個時候?qū)嶋H上C里面有兩個show方法?!窟@段有待於斟酌。

出現(xiàn)這種情況的時候 如果通過基類調(diào)用的話 就選距離那個基類最近的方法。所以會調(diào)用A中的Show方法。

看了回復(fù)覺得徐少俠解釋的非常好!!

#23樓2009-08-10 14:46 | 徐少俠      

用距離基類近來解釋似乎不科學(xué)

A類有虛Show

B類就已經(jīng)有兩個Show方法了

C也的確有兩個

由于最終的變量是A類型的,因此搜索函數(shù)入口時從基類A的入口表開始,根據(jù)虛方法定義查找子類的重寫方法,但是由于無法再B類定義中發(fā)現(xiàn)override方法
則最終調(diào)用的是A的現(xiàn)實

Ivony...解釋同樣精彩。

回復(fù)  引用  查看  刪除   #27樓2009-08-10 14:56 | Ivony...      

在C的內(nèi)部,你就能調(diào)用到這三個方法:

 
 
 
 
  1. public class C : B  
  2. {  
  3. //...  
  4.  
  5. public void Test()  
  6. {  
  7. ((A) this).Show();  
  8. base.Show();  
  9. this.Show();  
  10. }  
  11.  
  12. }  
  13. =======================================  
  14.  
  15.  
  16. Code2  
  17.     public class Program  
  18.     {  
  19.         static void Main(string[] args)  
  20.         {  
  21.             A a = new C();  
  22.             a.Show();  
  23.             Console.ReadKey();  
  24.         }  
  25.     }  
  26.     public class A  
  27.     {  
  28.         public virtual void Show()  
  29.         {  
  30.             Console.WriteLine("A");  
  31.         }  
  32.     }  
  33.     public class B:A  
  34.     {  
  35.         public override void Show()  
  36.         {  
  37.             Console.WriteLine("B");  
  38.         }  
  39.     }  
  40.     public class C:B  
  41.     {  
  42.         public new void Show()  
  43.         {  
  44.             Console.WriteLine("C");  
  45.         }  
  46.     } 

【編輯推薦】

  1. 簡單介紹C#預(yù)處理
  2. 學(xué)習(xí)C#無詞尾符號經(jīng)驗談
  3. C#調(diào)用QuickTest自動化
  4. 詳解C#正規(guī)表達(dá)式
  5. C#字符串插入html標(biāo)簽

新聞標(biāo)題:大家一起探討兩道C#面試題
本文地址:http://www.5511xx.com/article/ccocghh.html