在 C# 中,new 關鍵字可用作運算子、修飾符或約束

1、new 運算子:用於建立物件和呼叫建構函式。
2、new 修飾符:用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。
3、new 約束:用於在泛型宣告中約束可能用作型別引數的引數的型別。

new關鍵字在我們的程式中可謂是無時不刻在用到,那麼new關鍵字都可以用在哪些地方呢?考慮以下幾個問題:

1、new一個class物件和new一個struct或者new一個enum有什麼不同?

   new一個class時,new完成2個內容:一是呼叫new obj命令為例項在託管堆中分配記憶體,二是呼叫建構函式實現物件初始化。

   new一個struct時,new運算子用於呼叫其建構函式,完成例項的初始化。

2、new在.NET中除了建立物件例項外,還可以做什麼?

   new關鍵字:作為運算子可以建立物件和呼叫建構函式;

   作為修飾符可以用於向基類成員隱藏繼承成員,實現派生類中隱藏基類的virtual方法,不能和override共存;

   作為約束可以在泛型宣告中約束可能用作型別引數的引數型別,即new約束指定泛型類宣告中的任何型別引數都必須要有公共的無參建構函式;

   使用new關鍵字實現多型。

3、new運算子可以過載嗎?

   new運算子不可以過載。

4、泛型中new關鍵字的作用?

   new運算子用於返回一個引用,指向系統分配的託管堆的記憶體地址,new分配記憶體失敗,將引發OutOfMemoryException異常。

5、new一個繼承下來的方法和override有什麼區別?

   new是隱藏基類方法,override是覆寫基類方法。如果要訪問new隱藏了的基類成員需要使用base關鍵字實現。

    隱藏和重寫基類方法的異同

    1:方法重寫:就是在基類中的方法用virtual關鍵字來標識,然後在繼承類中對該類進行重寫(override),這樣基類中的方法已經被重寫了,已經失去了功能了。當讓基類的物件的引用直接指向繼承類的物件時(多型性),呼叫該方法則是呼叫的繼承類的方法。

    2:方法隱藏:無論基類中的方法是否用了virtual關鍵字,繼承類中都可以用new關鍵字(如果不用new的話,不會產生錯誤,但會生成一個編譯警告)將基類中的方法隱藏,所謂隱藏就是隱藏,不像重寫,重寫就是原來的(基類中)已經不存在了,而隱藏是原來的還存在。所以當讓基類的物件的引用直接指向繼承類的物件時(多型性),呼叫該方法則是呼叫的基類的方法。

public class BaseClass
    {
        public void functionA()
        {
            Console.WriteLine("BaseFunctionA http://www.cnblogs.com/sosoft/");
        }
        public virtual void functionB()
        {
            Console.WriteLine("BaseFunctionB http://www.cnblogs.com/sosoft/");
        }
    }
   public class DerivedClass:BaseClass
    {
        public new void functionA()
        {
            Console.WriteLine("DerivedFunctionA http://www.cnblogs.com/sosoft/");
        }
        public override void functionB()
        {
            Console.WriteLine("DerivedFunctionB http://www.cnblogs.com/sosoft/");
        }
    }

呼叫:
BaseClass baseFunction=new DerivedClass();
baseFunction.functionA();
baseFunction.functionB();

    得到的結果是:

    BaseFunctionA http://www.cnblogs.com/sosoft/

    DerivedFunctionB http://www.cnblogs.com/sosoft/

6、int i和int i = new int()有什麼不同?

   new一個int時,new運算子用於初始化其值為0,使建構函式完成更優越的初始化操作。

通過繼承隱藏名稱採用下列形式之一:

•引入類或結構中的常數、指定、屬性或型別隱藏具有相同名稱的所有基類成員。

•引入類或結構中的方法隱藏基類中具有相同名稱的屬性、欄位和型別。 同時也隱藏具有相同簽名的所有基類方法。

•引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。

疑問:new隱藏的應用場景?