您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C#8泛型Attribute怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C#8泛型Attribute怎么理解”吧!
從一開始, Attribute 就是.NET 的一部分。因此,它們在引入泛型之前就已經(jīng)被創(chuàng)建好,這意味著如果要引用屬性中的類型,必須暴露一個 Type 參數(shù)或?qū)傩?。例如?/p>
[TypeConverter(typeof(X))]
這種模式存在一些限制。在上面的示例中,X 必須有一個無參數(shù)的構(gòu)造函數(shù),并繼承 TypeConverter。編譯器不會強制這些,所以開發(fā)人員只能在運行時發(fā)現(xiàn)錯誤。
相反,如果我們使用泛型類型參數(shù),那么就可以在編譯器強制執(zhí)行這些規(guī)則,而且語法會稍微清晰一些。
[TypeConverter<X>]
理論上,“Allow Generic Attributes”提案是一個非常簡單的變更。CLR 已經(jīng)支持這個概念,問題是如何在.NET 語言中使用它。但有時候理論和現(xiàn)實是兩條平行線,而且即使 CLR 可以支持,并不代表就一定會支持。Jan Kotas 解釋說:
我認(rèn)為這個問題的本質(zhì)與局部引用和 return 類似。局部引用和 return 不受任何 API 的限制,理論上它們在現(xiàn)有的運行時、工具和庫上都能正常運行。但在實際當(dāng)中,它們可能不能正常運行,因為它們暴露了預(yù)先存在的錯誤和限制,可能是因為它們的處理路徑從未被執(zhí)行過,或者它們明顯不在預(yù)期之內(nèi)。與引用 return 相關(guān)的錯誤和問題剛剛開始出現(xiàn),因為人們開始使用這項功能,并發(fā)現(xiàn)了一些不奏效的地方。我認(rèn)為這在預(yù)期之內(nèi)。我們應(yīng)該承認(rèn)這些事實,并且不會采取之前我們撤回默認(rèn)值類型構(gòu)造函數(shù)功能那樣的行動。
這個功能非常類似。ECMA 并沒有針對禁止使用泛型 Attribute 的內(nèi)容,在理論上應(yīng)該可以正常運行,但實際上卻沒有。如果要正常運行,必須更新整個系統(tǒng)中的很多部件:
存在多個運行時(Mono、CoreRT、整個框架);
IL 的一些工具也可能會受到影響(編譯器、基于 Cecil 或基于 CCI2 的工具);
可能需要用于訪問泛型 Attribute 的 API(例如,現(xiàn)有的反射 API 不允許你訪問泛型 Attribute——你必須進(jìn)行枚舉)。
該提案的一個限制是在編譯時必須“關(guān)閉”Attribute 功能。下面是提案中提供的一個啟用泛型 Attribute 的例子。
[SomeAttribute<T>]public void DoSomething<T>(T input) { }
因為 T 不是在編譯時定義的,因此反射機制就不知道這個表達(dá)式會返回什么。
typeof(GenericClass<>).GetMethod("DoSomething").GetCustomAttributes()
狀態(tài)
目前,泛型 Attribute 功能列在C# 8 路線圖中,狀態(tài)為“進(jìn)行中”。
到此,相信大家對“C#8泛型Attribute怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。