读:[你必须知道的.NET] 第五回:深入浅出关键字---把new说透
?一般說來,new關鍵字在.NET中用于以下幾個場合,這是MSDN的典型解釋:
- 作為運算符, 用于創建對象和調用構造函數。
本文的重點內容,本文在下一節來重點考慮。
- 作為修飾符,用于向基類成員隱藏繼承成員。
作為修飾符,基本的規則可以總結為:實現派生類中隱藏方法,則基類方法必須定義為virtual;new作為修飾符,實現隱藏基類成員時,不可和override共存,原因是這兩者語義相斥:new用于實現創建一個新成員,同時隱藏基類的同名成員;而override用于實現對基類成員的擴展。
另外,如果在子類中隱藏了基類的數據成員,那么對基類原數據成員的訪問,可以通過base修飾符來完成。
?
- ?作為約束,用于在泛型聲明中約束可能用作類型參數的參數的類型。
?MSDN中的定義是:new?約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。當泛型類創建類型的新實例時,將此約束應用于類型參數。注意:new作為約束和其他約束共存時,必須在最后指定。
- ?使用new實現多態。 這不是我熟悉的話題,詳細的內容可以參見?《多態與 new [C#]》,這里有較詳細的論述
?1 不斷的學習代碼;
2 經常看看IL語言的運行細節,對于提供.NET的認識非常有效。
- new一個class時,new完成了以下兩個方面的內容:一是調用newobj命令來為實例在托管堆中分配內存;二是調用構造函數來實現對象初始化。
- new一個struct時,new運算符用于調用其帶構造函數,完成實例的初始化。
- new一個int時,new運算符用于初始化其值為0。
- 另外必須清楚,值類型和引用類型在分配內存時是不同的,值類型分配于線程的堆棧(stack)上,并變量本身就保存其實值,因此也不受GC的控制,;而引用類型變量,包含了指向托管堆的引用,內存分配于托管堆(managed heap)上,內存收集由GC完成。?
?另外還有以下規則要多加注意:
- new運算符不可重載。
- new分配內存失敗,將引發OutOfMemoryException異常。?
對于基本類型來說,使用new操作符來進行初始化的好處是,某些構造函數可以完成更優越的初始化操作,而避免了不高明的選擇,?
?
???1?/*
??2??*?Created?by?BpLoveGcy.cnblogs.com??3??*?Gump?Yin
??4??*?Date:?2010-3-30
??5??*?Time:?13:16
??6??*?
??7??*?Version:
??8??*?CopyRight:http://BpLoveGcy.cnblogs.com/
??9??*/
?10?
?11?using?System;
?12?using?NUnit.Framework;
?13?using?System.Collections.Generic;
?14?
?15?namespace?MustKnownDotNet
?16?{
?17?????class?Person
?18?????{
?19?????????public?Person(int?age)
?20?????????{
?21?????????????this.age?=?age;
?22?????????}
?23?????????///?<summary>
?24?????????///?0?not?known
?25?????????///?1?man
?26?????????///?2?woman
?27?????????///?</summary>
?28?????????///?<returns></returns>
?29?????????public?virtual?int?Gender()
?30?????????{
?31?????????????return?0;
?32?????????}
?33?
?34?????????protected?int?age;
?35?????????public?int?Age()
?36?????????{
?37?????????????return?age;
?38?????????}
?39?????}
?40?????class?Man?:?Person
?41?????{
?42?????????public?Man(int?age)
?43?????????????:?base(age)
?44?????????{?}
?45?
?46?????????public?override?int?Gender()
?47?????????{
?48?????????????return?1;
?49?????????}
?50?
?51?????????public?new?int?Age()
?52?????????{
?53?????????????return?base.age?+?2;
?54?????????}
?55?????}
?56?????class?Woman?:?Person
?57?????{
?58?????????public?Woman(int?age)
?59?????????????:?base(age)
?60?????????{?}
?61?
?62?????????public?override?int?Gender()
?63?????????{
?64?????????????return?2;
?65?????????}
?66?
?67?????????public?new?int?Age()
?68?????????{
?69?????????????return?base.age?-?2;
?70?????????}
?71?????}
?72?
?73?????public?class?SingleList<T>?where?T?:?new()
?74?????{
?75?????????public?T?AddNewItem()
?76?????????{
?77?????????????return?new?T();
?78?????????}
?79?????}
?80?
?81?????[TestFixture]
?82?????public?class?New_Test
?83?????{
?84?????????[Test]
?85?????????public?void?TestMethod()
?86?????????{
?87?????????????Person?p?=?new?Man(30);
?88?
?89?????????????Assert.AreEqual(1,?p.Gender());
?90?????????????Assert.AreEqual(30,?p.Age());
?91?????????????Assert.AreEqual(30?+?2,?((Man)p).Age());
?92?????????}
?93?
?94?????????[Test]
?95?????????public?void?TestMethod1()
?96?????????{
?97?????????????Person?p?=?new?Woman(30);
?98?????????????Assert.AreEqual(2,?p.Gender());
?99?????????????Assert.AreEqual(30,?p.Age());
100?????????????Assert.AreEqual(30?-?2,?((Woman)p).Age());
101?????????}
102?????????[Test]
103?????????public?void?TestMethod2()
104?????????{
105?????????????Person?p?=?new?Person(30);
106?
107?????????????Assert.AreEqual(30,?p.Age());
108?????????????Assert.AreEqual(0,?p.Gender());
109?????????}
110?????????[Test]
111?????????public?void?TestMethod3()
112?????????{
113?????????????string?str?=?new?string('*',?100);
114?//????????????Console.WriteLine(str);
115?????????????//?instead?of?the?following?
116?????????????string?a?=?"****************************************************************************************************";
117?????????????
118?????????????Assert.AreEqual(str?,?a);
119?????????}
120?????}
121?}
122?
?
?
ref:http://www.cnblogs.com/anytao/archive/2007/04/28/must_net_05.html?
?
?
?
?
轉載于:https://www.cnblogs.com/BpLoveGcy/archive/2010/03/30/1700646.html
總結
以上是生活随笔為你收集整理的读:[你必须知道的.NET] 第五回:深入浅出关键字---把new说透的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows消息定义
- 下一篇: 我只有两天