c# 7.3 版本有兩個主要主題。 第乙個主題提供使安全**的效能與不安全**的效能一樣好的功能。 第二個主題提供對現有功能的增量改進。 此外,在此版本中新增了新的編譯器選項。
以下新增功能支援使安全**獲得更好的效能的主題:
對現有功能進行了以下增強:
新的編譯器選項為:
01 啟用更高效的安全**
你應能夠安全地編寫效能與不安全**一樣好的 c# **。 安全**可避免錯誤類,例如緩衝區溢位、雜散指標和其他記憶體訪問錯誤。 這些新功能擴充套件了可驗證安全**的功能。努力使用安全結構編寫更多**。 這些功能使其更容易實現。
1.1 索引 fixed 欄位不需要進行固定
定義乙個結構體
unsafestruct
s
在早期版本的 c# 中,需要固定變數才能訪問屬於myfixedfield
的整數之一。 現在,以下**進行編譯,而不將變數p
固定到單獨的fixed
語句中:
classc}
變數p
訪問myfixedfield
中的乙個元素。 無需宣告單獨的int*
變數。 請注意,你仍然需要unsafe
上下文。 在早期版本的 c# 中,需要宣告第二個固定的指標:
classc }
}
有關詳細資訊,請參閱有關fixed
語句的文章。
1.2 可能會重新分配 ref 區域性變數
現在,在對ref
區域性變數進行初始化後,可能會對其重新分配,以引用不同的例項。 以下**現在編譯:
ref verylargestruct reflocal = ref verylargestruct; //初始化reflocal = ref anotherverylargestruct; //
重新分配後,反射引用不同的儲存。
有關詳細資訊,請參閱有關ref
返回和ref
區域性變數以及foreach
的文章。
1.3 stackalloc 陣列支援初始值設定項
當你對陣列中的元素的值進行初始值設定時,你已能夠指定該值:
var arr = newint[3] ;
var arr2 = new
int ;
現在,可向使用stackalloc
進行宣告的陣列應用同一語法:
int* parr = stackallocint[3] ;
int* parr2 = stackalloc
int ;
span
arr = stackalloc ;
有關詳細資訊,請參閱stackalloc
運算子一文。
1.4 更多型別支援 fixed 語句
fixed
語句支援有限的一組型別。 從 c# 7.3 開始,任何包含返回ref t
或ref readonly t
的getpinnablereference()
方法的型別均有可能為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
引數修飾符時,這兩個方法將導致多義性:
staticvoid
m(s arg);
static
void m(in s arg);
現在,通過值(前面示例中的第乙個)的過載比通過唯讀引用版本的過載更好。 若要使用唯讀引用引數呼叫版本,必須在呼叫方法前新增in
修飾符。
有關詳細資訊,請參閱有關in
引數修飾符的文章。
2.4 擴充套件初始值設定項中的表示式變數
已對在 c# 7.0 中新增的允許out
變數宣告的語法進行了擴充套件,以包含字段初始值設定項、屬性初始值設定項、建構函式初始值設定項和查詢子句。 它允許使用如以下示例中所示的**:
publicclassb}
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開始,過載解析規則的設計就相當有問題。在某些情況下,它會選兩個或更多方法作為候選,雖然所有這些方法中只有乙個會被使用。根據這些錯誤選出的方法的優先順序,編輯器要麼會報沒有匹配的方法,要麼會報匹配不明...