匿名型別是不是強型別?

KAnts發表於2013-08-12

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

什麼是匿名型別?

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

匿名型別和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 ? "" : "" }用於友好的資料繫結,但這僅限於這種繫結的地方非常非常少。例如:下拉框的繫結。

結語

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

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

相關文章