日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

winowsformshost 的构造函数执行符合指定的绑定约束的_C# 应该允许为 struct 定义无参构造函数...

發(fā)布時(shí)間:2023/12/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 winowsformshost 的构造函数执行符合指定的绑定约束的_C# 应该允许为 struct 定义无参构造函数... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
struct QuaternionStruct {float x;float y;float z;float w; }

這是一個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。