匿名類型是不是強類型?


在一次會議上由於一些需要提到了匿名類型,也由此展開了兩批人,我和另一位主張匿名類型不是強類型,而另兩位則覺得匿名類型屬於強類型,此博文主要深入了解一下匿名類型。

什么是匿名類型?

原來不想寫這個標題相關內容的,因為類似文章還是很多的,但為了一些新人能更好的閱讀本文章就順便提及一下,這里不涉及太深的東西,只是簡單的介紹。

匿名類型和var關鍵字是Visual C# 3.0提供的一個新特性或者說是語法糖,var是隱式類型而並不是類型javascript中的var

var user = new { Id = 1, Name = "張三", Age = 15 };
Console.WriteLine(user.Name);

詳解匿名類型

匿名類型並不屬於.NET Framework

image

在MSDN的文檔中其實匿名類型並不屬於.NET Framework,它屬於Visual Studio更准確的來說它屬於Visual C# 3.0,不扯太多題外話,再扯下去記得再"論.NET Framework和C#"哈哈。

匿名類型的智能感知

imageimage

從這邊來看匿名類型是可以智能感知的,那是否說明匿名類型就是一個強類型呢?

匿名類型是只讀的

image

匿名類型中的所有屬性器除在初始化時候都是只讀的,所以一旦初始化成功后它將無法進行賦值。

無法在一個數組內添加兩種不同屬性的匿名類型

image

我們來看看反編譯之后他們會生產什么?

image

反編譯之后會發現一個<>f__AnonymousType0<int, string, int>,這個類型是什么呢?定義結構跟Tuple<>非常的相像。如果定義了類型那么它不就是一個強類型嗎?我們追蹤看看。

image

會發現提示出是由編譯器生成的類,我們無法追蹤他,也無法確定他是否定義了這個類。

匿名類型到底是不是強類型?

首先不饒那么多彎,我先闡述一下我個人的想法,我個人覺得匿名類型不是一個“強類型”

當然這邊強類型加了引號,其實在C#中所有的類型都是強類型的,因為C#本身就是一個強類型語言。

但這邊所指的強類型更傾向於使用,因為匿名類型脫離了var只能將其轉換成object類型,那么它將無法擁有神奇的智能感知,再加上var的使用是有限制的,var不能在全局定義,只能在方法體內定義,所以脫離了當前方法體它將不再擁有智能感知的光環。

其實在本人的日常開發中匿名類型使用的極少,幾乎沒有,個人更傾向把匿名類型使用在數據綁定上,比如把bool類型的IsEnable投射至匿名類型中的new { IsEnable = isEnable ? "" : "" }用於友好的數據綁定,但這僅限於這種綁定的地方非常非常少。例如:下拉框的綁定。

結語

這次在博客園的第二篇文章,排版、潤色還有所欠缺,希望能堅持寫博文以彌補這些問題。

歡迎大家和諧討論( ̄ˇ ̄)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM