C 7 3 新增功能

2022-02-15 02:16:53 字數 4242 閱讀 3405

c# 7.3 版本有兩個主要主題。 第乙個主題提供使安全**的效能與不安全**的效能一樣好的功能。 第二個主題提供對現有功能的增量改進。 此外,在此版本中新增了新的編譯器選項。

以下新增功能支援使安全**獲得更好的效能的主題:

對現有功能進行了以下增強:

新的編譯器選項為:

01 啟用更高效的安全**

你應能夠安全地編寫效能與不安全**一樣好的 c# **。 安全**可避免錯誤類,例如緩衝區溢位、雜散指標和其他記憶體訪問錯誤。 這些新功能擴充套件了可驗證安全**的功能。努力使用安全結構編寫更多**。 這些功能使其更容易實現。

1.1 索引 fixed 欄位不需要進行固定

定義乙個結構體

unsafe

struct

s

在早期版本的 c# 中,需要固定變數才能訪問屬於myfixedfield的整數之一。 現在,以下**進行編譯,而不將變數p固定到單獨的fixed語句中:

class

c}

變數p訪問myfixedfield中的乙個元素。 無需宣告單獨的int*變數。 請注意,你仍然需要unsafe上下文。 在早期版本的 c# 中,需要宣告第二個固定的指標:

class

c }

}

有關詳細資訊,請參閱有關fixed語句的文章。

1.2 可能會重新分配 ref 區域性變數

現在,在對ref區域性變數進行初始化後,可能會對其重新分配,以引用不同的例項。 以下**現在編譯:

ref verylargestruct reflocal = ref verylargestruct; //

初始化reflocal = ref anotherverylargestruct; //

重新分配後,反射引用不同的儲存。

有關詳細資訊,請參閱有關ref返回和ref區域性變數以及foreach的文章。

1.3 stackalloc 陣列支援初始值設定項

當你對陣列中的元素的值進行初始值設定時,你已能夠指定該值:

var arr =  new

int[3] ;

var arr2 = new

int ;

現在,可向使用stackalloc進行宣告的陣列應用同一語法:

int* parr = stackalloc

int[3] ;

int* parr2 = stackalloc

int ;

span

arr = stackalloc ;

有關詳細資訊,請參閱stackalloc運算子一文。

1.4 更多型別支援 fixed 語句

fixed語句支援有限的一組型別。 從 c# 7.3 開始,任何包含返回ref tref readonly tgetpinnablereference()方法的型別均有可能為fixed。 新增此功能意味著fixed可與 system.span 和相關型別配合使用。

有關詳細資訊,請參閱語言參考中的fixed語句一文。

1.5 增強的泛型約束

現在,可以將型別 system.enum 或 system.delegate 指定為型別引數的基類約束。

現在也可以使用新的unmanaged約束來指定型別引數必須為「非託管型別」 。 「非託管型別」 不是引用型別,且在任何巢狀級別都不包含任何引用型別。

有關詳細資訊,請參閱有關where泛型約束和型別引數的約束的文章。

將這些約束新增到現有型別是不相容的更改。 封閉式泛型型別可能不再滿足這些新約束的要求。

02 提公升了現有功能

以下功能提供了對語言中的功能的改進。 這些功能提公升了在編寫 c# 時的效率。

2.1 元組支援 == 和 !=

c# 元組型別現在支援==!=。 有關詳細資訊,請參閱有關元組一文中的轉換等式部分。

2.2 將特性新增到自動實現的屬性的支援字段

現在支援此語法:

[field: somethingaboutfieldattribute]

public

int someproperty

屬性somethingaboutfieldattribute應用於編譯器生成的someproperty的支援字段。 有關詳細資訊,請參閱 c# 程式設計指南中的屬性。

2.3 in 方法過載解析決勝屬性

在新增in引數修飾符時,這兩個方法將導致多義性:

static

void

m(s arg);

static

void m(in s arg);

現在,通過值(前面示例中的第乙個)的過載比通過唯讀引用版本的過載更好。 若要使用唯讀引用引數呼叫版本,必須在呼叫方法前新增in修飾符。

有關詳細資訊,請參閱有關in引數修飾符的文章。

2.4 擴充套件初始值設定項中的表示式變數

已對在 c# 7.0 中新增的允許out變數宣告的語法進行了擴充套件,以包含字段初始值設定項、屬性初始值設定項、建構函式初始值設定項和查詢子句。 它允許使用如以下示例中所示的**:

public

classb}

public

class

d : b");

}}

2.5 改進了過載候選項

在每個版本中,對過載解析規則進行了更新,以解決多義方法呼叫具有「明顯」選擇的情況。此版本新增了三個新規則,以幫助編譯器選取明顯的選擇:

當方法組同時包含例項和靜態成員時,如果方法在不含例項接收器或上下文的情況下被呼叫,則編譯器將丟棄例項成員。 如果方法在含有例項接收器的情況下被呼叫,則編譯器將丟棄靜態成員。 在沒有接收器時,編譯器將僅新增靜態上下文中的靜態成員,否則,將同時新增靜態成員和例項成員。 當接收器是不明確的例項或型別時,編譯器將同時新增兩者。 靜態上下文(其中隱式this例項接收器無法使用)包含未定義this的成員的正文(例如,靜態成員),以及不能使用this的位置(例如,字段初始值設定項和建構函式初始值設定項)。

當乙個方法組包含型別引數不滿足其約束的某些泛型方法時,這些成員將從候選集中移除。

對於方法組轉換,返回型別與委託的返回型別不匹配的候選方法將從集中移除。

你將注意到此更改,因為當你確定哪個方法更好時,你將發現多義方法過載具有更少的編譯器錯誤。

03 新的編譯器選項

新的編譯器選項支援 c# 程式的新版本和 devops 方案。

3.1 公共或開放源**簽名

-publicsign編譯器選項指示編譯器使用公鑰對程式集進行簽名。 程式集被標記為已簽名,但簽名取自公鑰。 此選項使你能夠使用公鑰在開放源**專案中構建簽名的程式集。

有關詳細資訊,請參閱 -publicsign 編譯器選項一文。

3.2 pathmap

-pathmap編譯器選項指示編譯器將生成環境中的源路徑替換為對映的源路徑。-pathmap選項控制由編譯器編寫入 pdb 檔案或為 callerfilepathattribute 編寫的源路徑。

有關詳細資訊,請參閱 -pathmap 編譯器選項一文。

C7 3 用類實現A B

100 滿分 題目描述 下面的 宣告了兩個基類base1和base2,然後從這兩個基類按照公有方式派生出類derived。基類和派生類都各自包含乙個公有成員x,並且base1和base2各有接受乙個整型引數的建構函式,derived的建構函式接受base1和base2的物件引用a,b來初始化deri...

C 7 3新特性一覽

通過乙個相對較小的版本,c 7.3解決了一些自c 1和2以來長期懸而未決的問題。過載解析 從c 1.0開始,過載解析規則的設計就相當有問題。在某些情況下,它會選兩個或更多方法作為候選,雖然所有這些方法中只有乙個會被使用。根據這些錯誤選出的方法的優先順序,編輯器要麼會報沒有匹配的方法,要麼會報匹配不明...

C 7 3新特性一覽

通過乙個相對較小的版本,c 7.3解決了一些自c 1和2以來長期懸而未決的問題。過載解析 從c 1.0開始,過載解析規則的設計就相當有問題。在某些情況下,它會選兩個或更多方法作為候選,雖然所有這些方法中只有乙個會被使用。根據這些錯誤選出的方法的優先順序,編輯器要麼會報沒有匹配的方法,要麼會報匹配不明...