概述C# New運(yùn)算符
前段時(shí)間一個(gè)朋友問(wèn)到C#的New關(guān)鍵字有幾種用法,雖說(shuō)在日常編程中經(jīng)常用到這個(gè)小家伙,但它到底有幾種用法還真沒(méi)有留意過(guò),現(xiàn)將從網(wǎng)上總結(jié)出的資料記下以供同仁學(xué)習(xí)。
(1)C# New運(yùn)算符 用于創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù)。
(2)New 修飾符 用于隱藏基類(lèi)成員的繼承成員。
(3)New 約束 用于在泛型聲明中約束可能用作類(lèi)型參數(shù)的參數(shù)的類(lèi)型。
C# New運(yùn)算符
1.用于創(chuàng)建對(duì)象和調(diào)用構(gòu)造函數(shù)
例:Class_Test MyClass = New Class_Test();
2.也用于為值類(lèi)型調(diào)用默認(rèn)的構(gòu)造函數(shù)
例:int myInt = New int();
myInt 初始化為 0,它是 int 類(lèi)型的默認(rèn)值。該語(yǔ)句的效果等同于:int myInt = 0;
3.不能重載C# New運(yùn)算符。
4.如果C# New運(yùn)算符分配內(nèi)存失敗,則它將引發(fā) OutOfMemoryException 異常。
New 修飾符
使用 New 修飾符顯式隱藏從基類(lèi)繼承的成員。若要隱藏繼承的成員,請(qǐng)使用相同名稱(chēng)在派生類(lèi)中聲明該成員,并用 New 修飾符修飾它。
請(qǐng)看下面的類(lèi):
- public class MyClass
- {
- public int x;
- public void Invoke() {}
- }
在派生類(lèi)中用 Invoke 名稱(chēng)聲明成員會(huì)隱藏基類(lèi)中的 Invoke 方法,即:
- public class MyDerivedC : MyClass
- {
- new public void Invoke() {}
- }
但是,因?yàn)樽侄?x 不是通過(guò)類(lèi)似名隱藏的,所以不會(huì)影響該字段。
通過(guò)繼承隱藏名稱(chēng)采用下列形式之一:
1.引入類(lèi)或結(jié)構(gòu)中的常數(shù)、指定、屬性或類(lèi)型隱藏具有相同名稱(chēng)的所有基類(lèi)成員。
2.引入類(lèi)或結(jié)構(gòu)中的方法隱藏基類(lèi)中具有相同名稱(chēng)的屬性、字段和類(lèi)型。同時(shí)也隱藏具有相同簽名的所有基類(lèi)方法。
3.引入類(lèi)或結(jié)構(gòu)中的索引器將隱藏具有相同名稱(chēng)的所有基類(lèi)索引器。
4.在同一成員上同時(shí)使用 New 和 override 是錯(cuò)誤的。
注意:在不隱藏繼承成員的聲明中使用 New 修飾符將生成警告。
示例
在該例中,嵌套類(lèi) MyClass 隱藏了基類(lèi)中具有相同名稱(chēng)的類(lèi)。該例不僅說(shuō)明了如何使用完全限定名訪問(wèn)隱藏類(lèi)成員,同時(shí)也說(shuō)明了如何使用New修飾符消除警告消息。
- using System;
- public class MyBaseC{
- public class MyClass{
- public int x = 200;
- public int y;
- }
- }
- public class MyDerivedC : MyBaseC{
- new public class MyClass // nested type hiding the base type members{
- public int x = 100;
- public int y;
- public int z;
- }
- public static void Main(){
- // Creating object from the overlapping class:
- MyClass S1 = new MyClass();
- // Creating object from the hidden class:
- MyBaseC.MyClass S2 = new MyBaseC.MyClass();
- Console.WriteLine(S1.x);
- Console.WriteLine(S2.x);
- }
- }
【編輯推薦】