在一次會議上由於一些需要提到了匿名類型,也由此展開了兩批人,我和另一位主張匿名類型不是強類型,而另兩位則覺得匿名類型屬於強類型,此博文主要深入了解一下匿名類型。
原來不想寫這個標題相關內容的,因為類似文章還是很多的,但為了一些新人能更好的閱讀本文章就順便提及一下,這裡不涉及太深的東西,只是簡單的介紹。
匿名類型和var關鍵字是Visual C# 3.0提供的一個新特性或者說是語法糖,var是隱式類型而並不是類型javascript中的var。
匿名類型並不屬於.NET Framework
在MSDN的文檔中其實匿名類型並不屬於.NET Framework,它屬於Visual Studio更准確的來說它屬於Visual C# 3.0,不扯太多題外話,再扯下去記得再"論.NET Framework和C#"哈哈。
匿名類型的智能感知
從這邊來看匿名類型是可以智能感知的,那是否說明匿名類型就是一個強類型呢?
匿名類型是只讀的
匿名類型中的所有屬性器除在初始化時候都是只讀的,所以一旦初始化成功後它將無法進行賦值。
無法在一個數組內添加兩種不同屬性的匿名類型
我們來看看反編譯之後他們會生產什麼?
反編譯之後會發現一個<>f__AnonymousType0<int, string, int>,這個類型是什麼呢?定義結構跟Tuple<>非常的相像。如果定義了類型那麼它不就是一個強類型嗎?我們追蹤看看。
會發現提示出是由編譯器生成的類,我們無法追蹤他,也無法確定他是否定義了這個類。
首先不饒那麼多彎,我先闡述一下我個人的想法,我個人覺得匿名類型不是一個“強類型”。
當然這邊強類型加了引號,其實在C#中所有的類型都是強類型的,因為C#本身就是一個強類型語言。
但這邊所指的強類型更傾向於使用,因為匿名類型脫離了var只能將其轉換成object類型,那麼它將無法擁有神奇的智能感知,再加上var的使用是有限制的,var不能在全局定義,只能在方法體內定義,所以脫離了當前方法體它將不再擁有智能感知的光環。
其實在本人的日常開發中匿名類型使用的極少,幾乎沒有,個人更傾向把匿名類型使用在數據綁定上,比如把bool類型的IsEnable投射至匿名類型中的 { IsEnable = isEnable ? "" : "" }用於友好的數據綁定,但這僅限於這種綁定的地方非常非常少。例如:下拉框的綁定。
這次在博客園的第二篇文章,排版、潤色還有所欠缺,希望能堅持寫博文以彌補這些問題。
歡迎大家和諧討論( ̄ˇ ̄)