標籤:
三種用法如下:
在 C# 中,new 關鍵字可用作運算子、修飾符或約束。
1)new 運算子:用於建立對象和調用建構函式。這種大家都比較熟悉,沒什麼好說的了。
2)new 修飾符:在用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。
3)
new 約束:用於在泛型聲明中約束可能用作型別參數的參數的類型。關於第二種用法看下例:using System;namespace ConsoleApplication1{ public class BaseA { public int x = 1; public void Invoke() { Console.WriteLine(x.ToString()); } public int TrueValue { get { return x; } set { x = value; } } } public class DerivedB : BaseA { new public int x = 2; new public void Invoke() { Console.WriteLine(x.ToString()); } new public int TrueValue { get { return x; } set { x = value; } } } class Test { static void Main(string[] args) { DerivedB b = new DerivedB(); b.Invoke();//調用DerivedB的Invoke方法,輸出:2 Console.WriteLine(b.x.ToString());//輸出DerivedB的成員x值:2 BaseA a = b; a.Invoke();//調用BaseA的Invoke方法,輸出:1 a.TrueValue = 3;//調用BaseA的屬性TrueValue,修改BaseA的成員x的值 Console.WriteLine(a.x.ToString());//輸出BaseA的成員x的值:3 Console.WriteLine(b.TrueValue.ToString());//輸出DerivedB的成員x的值,仍然是:1//可見,要想訪問被隱藏的基類的成員變數、屬性或方法,辦法就是將子類造型為父類,然//後通過基類訪問被隱藏的成員變數、屬性或方法。 } }}
new約束指定泛型類聲明中的任何型別參數都必須具有公用的無參數建構函式.請看下例:using System;using System.Collections.Generic;namespace ConsoleApplication2{ public class Employee { private string name; private int id; public Employee() { name = "Temp"; id = 0; } public Employee(string s, int i) { name = s; id = i; } public string Name { get { return name; } set { name = value; } } public int ID { get { return id; } set { id = value; } } } class ItemFactory<T> where T : new() { public T GetNewItem() { return new T(); } } public class Test { public static void Main() { ItemFactory<Employee> EmployeeFactory = new ItemFactory<Employee>(); ////此處編譯器會檢查Employee是否具有公有的無參建構函式。 //若沒有則會有The Employee must have a public parameterless constructor 錯誤。 Console.WriteLine("{0}‘ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID); } }}
C# new用法總結