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