前幾天去家公司面試,有一道這樣的題:寫出c#中new關鍵字的三種用法,思前想後挖空心思也只想出了兩種用法,回來查了下msdn,還真是有第三種用法:用於在泛型宣告中約束可能用作型別引數的引數的型別,這是在framework 2.0 中定義泛行時才會使用到的,自己對c# 2.0 中的支援還只是粗通皮毛,怪不得累死so many腦細胞也沒能想不出這第三種來!
三種用法如下:
在 c# 中,new 關鍵字可用作運算子、修飾符或約束。
1)new 運算子
2)new 修飾符
:在用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。
3)new 約束
:用於在泛型宣告中約束可能用作型別引數的引數的型別。
關於第二種用法看下例:
using
system;
namespace
public
int truevalue
set }}
public
class
derivedb : basea
newpublic
int truevalue
set }}
class
test}}
new約束指定泛型類宣告中的任何型別引數都必須具有公共的無引數建構函式.請看下例:
using
system;
using
system.collections.generic;
namespace
public employee(string s, int i)
public
string name
set
}public
int id
set }}
class
itemfactory
where t : new()
}public
class
test
'id is .", employeefactory.getnewitem().name, employeefactory.getnewitem().id);}}
}見msdn上關於new的解釋
在用作修飾符時,new
關鍵字可以顯式隱藏從基類繼承的成員。
隱藏繼承的成員時,該成員的派生版本將替換基類版本。
雖然可以在不使用 new
修飾符的情況下隱藏成員,但會生成警告。
如果使用 new
顯式隱藏成員,則會取消此警告,並記錄要替換為派生版本這一事實。
若要隱藏繼承的成員,請使用相同名稱在派生類中宣告該成員,並使用 new
修飾符修飾該成員。
例如:
public
class basec
}public
class derivedc : basec
}在此示例中,derivedc.invoke 隱藏了 basec.invoke。
字段 x 不受影響,因為它沒有被類似名稱的字段隱藏。
通過繼承隱藏名稱採用下列形式之一:
對同一成員同時使用 new
和 override
是錯誤的做法,因為這兩個修飾符的含義互斥。
new 修飾符會用同樣的名稱建立乙個新成員並使原始成員變為隱藏的。
override
修飾符會擴充套件繼承成員的實現。
在不隱藏繼承成員的宣告中使用 new
修飾符將會生成警告。
示例
在該例中,基類 basec 和派生類 derivedc 使用相同的欄位名 x,從而隱藏了繼承欄位的值。
該示例演示了 new
修飾符的用法。
另外還演示了如何使用完全限定名訪問基類的隱藏成員。
public
class basec
public
class derivedc : basec
}
/*output:
10055
22*/
在此示例中,巢狀類隱藏了基類中同名的類。
此示例演示了如何使用 new
修飾符來消除警告訊息,以及如何使用完全限定名來訪問隱藏的類成員。
public
class basec
}
public
class derivedc : basec
static
void main()
}
/*output:
100200
*/如果移除 new
修飾符,該程式仍可編譯和執行,但您會收到以下警告:
the keyword new is required on 'myderivedc.x' because it hides inherited member 'mybasec.x'.
posted @
2017-05-24 17:05
00000000o 閱讀(
...)
編輯收藏
c new的三種形態
1 new operator new的第一種形態是new operator,它是語言內建的,不能過載。new operator完成以下三件工作 1.allocate memory for this object.2.call constructor to init that memory.3.ret...
java this 三種用法
public class thisdemo class student override public string tostring 列印結果 student name null,age 0 賦值沒有成功,說明 name 區域性變數 name 區域性變數 而不是name 成員變數 name 區域性...
c using 三種用法
1.using指令。using 命名空間名字,這樣可以在程式中直接用命令空間中的型別,而不必指定型別的詳細命名空間。這個功能也是最常用的,幾乎每個cs的程式都會用到。例如 using system 一般都會出現在 cs中。2.using別名。using 別名 包括詳細命名空間資訊的具體的型別。這種做...