C# 禁忌之術 method 修飾字 — new

  • 994
  • 0
  • 2017-10-22

C# 的繼承架構中,除常見的 virtualoverride 修飾字之外,再來就是 new 這個禁忌之術啦(不是 Class1 obj  = new Class1();  這種 new 啊~)!!何謂禁忌之術?以下的介紹就可以讓你瞭解為何不要輕易使用,很容易造成程式碼難以閱讀。各可怕的是在不知不覺中可能就使用了,不小心就會啟動的禁忌之術才是它可怕的地方,完全是手滑就開大的節奏。

此篇僅用這個例子來貫穿全文想要探討的,其中 class 定義如下:

接著,猜想一下,以下四個情境,分別會列印出什麼樣的字串?

 

答案是:答對了嗎?

以下就說明一下 C# 判斷、找尋 override function 的運作邏輯。假設型態分別為 TypeA 與 TypeB :

判斷邏輯如下:

從此圖可以看見,判斷邏輯中完全無關存不存在「new」這個關鍵字!也就是你可能不小心就啟動了禁忌之術。這個修飾字容易造成程式不易維護閱讀,非必要之時不要隨意使用。

在 class MyDerivedClass3 中 ShowText() 省略了 new 這個修飾字,new 為預設狀態,編譯也不會出錯,但會有 CS0108 的警告訊息:「'MyDerivedClass3.ShowText()' hides inherited member 'MyDerivedClass2.ShowText()'. Use the new keyword if hiding was intended.」。