winowsformshost 的构造函数执行符合指定的绑定约束的_C# 应该允许为 struct 定义无参构造函数...
這是一個四元數(shù)的簡單定義。
C# 目前的語法不允許為 struct 定義無參構造函數(shù),凡是未顯式調(diào)用帶參版本的構造函數(shù)時,struct 對象初始化時總是簡單的清零,這樣就可以實現(xiàn)高效初始化(想象你有一個 struct 數(shù)組,如果每個 struct 元素需要調(diào)用構造函數(shù),可能是非常大的開銷)。但是,有時 struct 的零狀態(tài)可能是沒有意義的(比如上面的 Quaternion,通常我們會將 w 字段初始化為 1,代表默認旋轉(zhuǎn)姿態(tài)),因為 C# 不允許為 struct 定義無參構造函數(shù),我們不得不使用其他方式初始化這種 struct。
那么,如果允許為 struct 定義無參構造函數(shù)呢?
C# 中未顯式初始化的成員字段會被初始化為默認值。對于引用類型成員字段,默認值是 null;對于值類型成員字段,默認值是零狀態(tài)。其實兩者本質(zhì)上都是執(zhí)行清零初始化,這在語法上是統(tǒng)一的。但是,如果需要顯式初始化呢?
class QuaternionClass {float x;float y;float z;float w;public QuaternionClass(){x = 0;y = 0;z = 0;w = 1;} }class Program {QuaternionStruct valueType = new QuaternionStruct();QuaternionClass referenceType = new QuaternionClass(); }這里,Program 的值類型字段和引用類型字段都調(diào)用了無參構造函數(shù)執(zhí)行初始化,但是結果卻完全不同:因為引用類型的自定義無參構造函數(shù)將 w 初始化為 1,這樣引用對象就不是零狀態(tài)了;而值類型的初始化語法則令人困惑,因為值類型根本沒有無參構造函數(shù),僅僅是執(zhí)行了清零初始化,這樣一個已經(jīng)初始化的值類型對象仍保持著沒有意義的零狀態(tài)!
也就是說,一個更統(tǒng)一、清晰、易用、易理解的語法,應當區(qū)別清零初始化與無參構造,將它們視為兩種不同的過程。同時應當允許為 struct 定義無參構造函數(shù)。
這樣可以帶來哪些好處/變化?
首先是用于初始化的表達式語法可以統(tǒng)一了:
void DoSomething() {// 這兩條語句都是執(zhí)行清零QuaternionStruct valueType1 = default;QuaternionClass referenceType1 = default; // 或者 null// 這兩條語句都可以將對象初始化為有效狀態(tài)(非零狀態(tài))QuaternionStruct valueType2 = new QuaternionStruct();QuaternionClass referenceType2 = new QuaternionClass();// 這兩條語句都創(chuàng)建了元素全是 default 值的數(shù)組var valueTypeArray = new QuaternionStruct[100];var referenceTypeArray = new QuaternionClass[100]; }同時也意味著 struct 的成員字段應當允許使用“=”設置初始值了。
高效清零初始化仍然有效,還可以通過編譯器優(yōu)化將沒有“實際價值”的自定義無參構造函數(shù)替換為高效清零。
還有就是如果定義了 struct 帶參版本的構造函數(shù)而沒有定義無參版本,理想設計應當是和 class 語法一致,即視為不存在無參構造函數(shù);但考慮到兼容現(xiàn)有代碼,凡是顯式調(diào)用無參構造函數(shù)的代碼暫處理為警告而非錯誤。
對于現(xiàn)有代碼,因為之前沒人寫過 struct 的無參構造函數(shù),所以凡是顯式調(diào)用無參構造函數(shù)的代碼與原語義是一致的。因此,允許為 struct 定義無參構造函數(shù)是向后兼容的。
(可能還有我沒考慮到的地方,歡迎交流)
總結
以上是生活随笔為你收集整理的winowsformshost 的构造函数执行符合指定的绑定约束的_C# 应该允许为 struct 定义无参构造函数...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: activity 防止多次打开_杭州下沙
- 下一篇: 3皮卡丘眨眼代码_眨眼检测调研以及活体检