今天突然有一種整理一下C#關鍵字的沖動,就轉化為行動了!
C#關鍵字完整列表
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
ecent
explicit
extern
false
finally
fixed
float
for
foreach
get
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null
object
out
override
partial
private
protected
public
readonly
ref
return
sbyte
sealed
set
short
sizeof
stackalloc
static
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
value
virtual
volatile
volatile
void
where
while
yield
其中有幾個比較容易弄錯的
關鍵字 描 述
abstract 可以和類、方法、屬性、索引器及事件一起使用,
標識一個可以擴展但不能被實體化的、必須被實現的類或方法。
as 一個轉換操作符,如果轉換失敗,就返回null。
base 用於訪問被派生類或構造中的同名成員隱藏的基類成員。
catch 定義一個代碼塊,在特定類型異常拋出時,執行塊內代碼。
參見try和finally。
checked 既是操作符又是語句。
確保編譯器運行時,檢查整數類型操作或轉換時出現的溢出。
const 標識一個可在編譯時計算出來的變量值,即一經指派不可修改的值。
delegate 指定一個聲明為一種委托類型。委托把方法封裝為可調用實體,
能在委托實體中調用。
enum 表示一個已命名常量群集的值類型。
event 允許一個類或對象提供通知的成員,他必須是委托類型。
explicit 一個定義用戶自定義轉換操作符的操作符,
通常用來將內建類型轉換為用戶定義類型或反向操作。
必須再轉換時調用顯示轉換操作符。
extern 標識一個將在外部(通常不是c#語言)實現的方法。
finally 定義一個代碼塊,在程序控制離開try代碼快後執行。參見try和catch。
fixed 在一個代碼塊執行時,在固定內存位置為一個變量指派一個指針。
foreach 用於遍歷一個群集的元素。
goto 一個跳轉語句,將程序執行重定向到一個標簽語句。
implicit 一個操作符,定義一個用戶定義的轉換操作符。
通常用來將預定義類型轉換為用戶定義類型或反向操作。
隱式轉換操作符必須在轉換時使用。
interface 將一個聲明指定為接口類型,即實現類或構造必須遵循的合同。
internal 一個訪問修飾符。
namespace 定義一個邏輯組的類型和命名空間。
operator 用來聲明或多載一個操作符。
out 標識一個參數值會受影響的參數,但在傳入方法時,
該參數無需先初始化。
params 聲明一個參數數組。如果使用,必須修改指定的最後一個參數。
允許可選參數。
readonly 標識一個變量的值在初始化後不可修改。
ref 標識一個參數值可能會受影響的參數。
sealed 防止類型被派生,防止方法和property被覆載。
sizeof 一個操作符,以byte為單位返回一個值類型的長度。
stackalloc 返回在堆上分配的一個內存塊的指針。
struct struct是一種值類型,可以聲明常量、字段、方法、property、
索引器、操作符、構造器和內嵌類型。
throw 拋出一個異常。
try 異常處理代碼塊的組成部分之一。try代碼塊包括可能會
拋出異常的代碼。參閱catch和finally關鍵字。
typeof 一個操作符,返回傳入參數的類型。
unchecked 禁止溢出檢查。
unsafe 標注包含指針操作的代碼塊、方法或類。
using 當用於命名空間時,using關鍵字允許訪問該命名空間中的類型,
而無需指定其全名。也用於定義finalization操作的范圍。
virtual 一個方法修飾符,標識可被覆載的方法。
volatile 標識一個可被操作系統、某些硬件設備或並發線程修改的attribute。
整理完後發現時間還早,就干脆再深入一點
sealed 修飾符表示密封用於類時,表示該類不能再被繼承,
不能和 abstract 同時使用,因為這兩個修飾符在含義上互相排斥用於方法和屬性時,
表示該方法或屬性不能再被繼承,必須和 override 關鍵字一起使用,因為使用 sealed 修飾符的方法或屬性肯定是
基類中相應的虛成員通常用於實現第三方類庫時不想被客戶端繼承,
或用於沒有必要再繼承的類以防止濫用繼承造成層次結構體系混亂恰當的利用
sealed 修飾符也可以提高一定的運行效率,因為不用考慮繼承
sealed(C# 參考)
當對一個類應用 sealed 修飾符時,此修飾符會阻止其他類從該類繼承。
在下面的示例中,類 B 從類 A 繼承,但是任何類都不能從類 B 繼承。
class A {}
sealed class B : A {}
還可以在重寫基類中的虛方法或虛屬性的方法或屬性上使用 sealed 修飾符。
這將使您能夠允許類從您的類繼承,並防止它們重寫特定的虛方法或虛屬性。
在下面的示例中,C 從 B 繼承,但 C 無法重寫在 A 中聲明並在 B 中密封的虛函數 F。
說明:
當在類中定義新的方法或屬性時,通過不將這些方法或屬性聲明為 virtual,可防止派生類重寫這些方法或屬性。
將 abstract 修飾符用於密封類是錯誤的做法,因為抽象類必須由提供抽象方法或屬性的實現的類繼承。
當應用於方法或屬性時,sealed 修飾符必須始終與 override 一起使用。
由於結構是隱式密封的,因此它們不能被繼承。
abstract & virtual
abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。在類聲明中使用 abstract 修飾符以指示類只能是其他類的基類。接下來描述了abstract的一些特性:不能實例化;可以包含抽象方法和抽象訪問器;不能用 sealed 修飾符修改抽象類,意味著該類不能被繼承;從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現;
在方法或屬性聲明中使用 abstract 修飾符以指示此方法或屬性不包含實現等等。"abstract"可以修飾類、方法、屬性、索引器及事件。
而看到virtual關鍵字的時候,產生了一個疑問:"virtual"關鍵字只能修飾方法和屬性,卻不能修飾類~但清楚記得老師講c++的時候有一個概念,叫虛基類。難道c#把virtual的這個特性去掉了?然後我到google找答案~看到了兩篇文章“c++虛基類”和“深入剖析c#繼承機制”,終於明白了原來是由於這兩者的繼承機制不同而決定的。c++允許多重繼承,而c#只允許派生類從一個類中繼承,由於多重繼承產生的二義性問題需要虛基類來解決,所以c++有虛基類的概念,而c#由於單繼承的原因不會產生繼承而帶來的二義性問題,
所以不需要virtual關鍵修飾類。