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

大家一起探討兩道C#面試題

開發(fā) 后端
最近憋著因?yàn)轫?xiàng)目要被印度搶走了,去別的組進(jìn)行了一次面試。有幾個C#面試題,和大家進(jìn)行探討,希望對大家有所幫助。

先看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。

引入和一點(diǎn)分析

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

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

  1. CLR可以直接生成字符串

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

  1. 2 看IL

  

看IL

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

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

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

【這個時(shí)候?qū)嶋H上C里面有兩個show方法。】這段有待於斟酌。

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

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

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

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

A類有虛Show

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

C也的確有兩個

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

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)驗(yàn)談
  3. C#調(diào)用QuickTest自動化
  4. 詳解C#正規(guī)表達(dá)式
  5. C#字符串插入html標(biāo)簽
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2009-08-11 14:59:57

一道面試題C#算法

2009-08-11 10:12:07

C#算法

2022-09-21 22:19:16

CSS面試題

2009-08-11 15:09:44

一道面試題C#算法

2021-04-13 08:50:21

JS作用域面試題

2024-06-04 14:52:28

2024-11-28 09:57:50

C#事件發(fā)布器

2024-10-11 17:09:27

2010-11-26 10:53:29

戴爾

2018-03-06 15:30:47

Java面試題

2017-12-14 08:04:21

Java面試程序

2011-05-23 11:27:32

面試題面試java

2021-03-18 00:04:13

C# 類型數(shù)據(jù)

2025-02-13 09:32:12

C#重寫override

2024-02-26 15:35:44

2024-04-15 08:34:43

2024-04-28 08:23:18

2009-09-14 18:24:56

CCNA認(rèn)證考試題庫

2021-06-05 13:44:08

遞歸策略鏈表

2023-10-10 08:00:07

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號