[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
[2] [你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
系列文章導航:
[你必須知道的.NET] 第四回:后來居上:class和struct
[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透
[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this
[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始
[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理
[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊
[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途
[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)
[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)
[你必須知道的.NET] 第十三回:從Hello, world開始認識IL
[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在
[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸
[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考
[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
本文將介紹以下內容:
• 面向對象基本概念
• new關鍵字深入淺出
• 對象創建的內存管理
1. 引言
園子里好像沒有或者很少把new關鍵字拿出來說的,那我就占個先機吧,呵呵。那么,我們到底有必要將一個關鍵字拿出來長篇大論嗎?看來是個問題。回答的關鍵是:你真的理解了new嗎?如果是,那請不要浪費時間,如果不是,那請繼續本文的循序之旅。
下面幾個問題可以大概的考察你對new的掌握,開篇之前,希望大家做個檢驗,如果通過了,直接關掉本頁即可。如果沒有通過,希望本文的闡述能幫你找出答案。
• new一個class對象和new一個struct或者enum有什么不同?
• new在.NET中有幾個用途,除了創建對象實例,還能做什么?
• new運算符,可以重載嗎?
• 范型中,new有什么作用?
• new一個繼承下來的方法和override一個繼承方法有何區別?
• int i和int i = new int()有什么不同?
2. 基本概念
一般說來,new關鍵字在.NET中用于以下幾個場合,這是MSDN的典型解釋:
• 作為運算符, 用于創建對象和調用構造函數。
本文的重點內容,本文在下一節來重點考慮。
• 作為修飾符,用于向基類成員隱藏繼承成員。
作為修飾符,基本的規則可以總結為:實現派生類中隱藏方法,則基類方法必須定義為virtual;new作為修飾符,實現隱藏基類成員時,不可和override共存,原因是這兩者語義相斥:new用于實現創建一個新成員,同時隱藏基類的同名成員;而override用于實現對基類成員的擴展。
另外,如果在子類中隱藏了基類的數據成員,那么對基類原數據成員的訪問,可以通過base修飾符來完成。
例如:
new作為修飾符
• 作為約束,用于在泛型聲明中約束可能用作類型參數的參數的類型。
MSDN中的定義是:new 約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。當泛型類創建類型的新實例時,將此約束應用于類型參數。
注意:new作為約束和其他約束共存時,必須在最后指定。
其定義方式為:
class Genericer<T> where T : new() { public T GetItem() { return new T(); } }
實現方式為:
Code
Code
• 使用new實現多態。 這不是我熟悉的話題,詳細的內容可以參見 《多態與 new [C#]》,這里有較詳細的論述。