C# 作為一種靜態類型語言,為什麼會引入 var?
01-14
最直接的原因當然是引入了匿名類型,沒var不行。另外這個和靜態類型沒關係,說到靜態類型,C#甚至連dynamic都有了。
var和靜態不靜態沒關係啊,編譯時推導出來類型就確定了動態的那個東西叫dynamic
又沒啥壞處啊,依然可以保證 strong typing,還能省略掉一次 unify,多好
C++也有auto了啊……var在C#中的作用是通過初始化表達式隱式推斷出一個變數的類型,這種語言特性在非常多的流行的靜態類型語言中都支持了,比如C++,Go等
要是用scala,就知道這玩意是多麼的酸爽到讓人想哭@vczh
c#的var跟js之類的var不是一樣的,c#的var在編譯的時候會先幫你轉化成正確的類型然後再編譯。所以別被var這個名字騙了。
我覺得你可能想問這個 dynamic
var 只是類型推導而已
var的作用
1.主要為了linq和lambda準備的,因為可以鏈式函數,比如list.where().ordernby().grounpby(),這樣連起來寫,每個函數返回類型是不同的,如果沒有var在寫的時候就是一直提示錯誤,直到你寫最後一個函數的返回值和前面一致時才停止提示,感官不好。2.鏈式寫法返回的介面類型很多,很長,可能你開始寫的時候並沒有想好返回的確切的類型,這時var就起到作用了。
3.也是很長的介面,類初始化時省的寫兩邊,把代碼意圖都蓋住了
4.為了匿名類
var是強類型,編譯器自動推導類型,編譯時會替換成確切的類型,這個和js中的var是不同的,js的var對應的是dynamic,運行時確定類型。var關鍵字和javascript中的var寫法雖然相似,但背後的機制有很大的差異。
C#中引入var並不代表用var聲明的變數不是強類型的,相反地,var關鍵字把類型確定的任務從開發者手中轉移給了類型推斷系統(Type Inference System),類型推斷系統可以根據你給變數賦予的值的類型推斷出變數類型。
簡而言之,我們所說的強類型是指在編譯時所有變數的類型都可以確定,而不是寫代碼時要聲明類型。
然後,究竟為什麼要引入var關鍵字呢?C#中有一個非常強大的特性是LINQ(Language Integrated Query),可以在各種IEnumerable&大概和c++里的auto一個意思,就是讓編譯器決定,是編譯器行為。而Js里是運行行為,不一樣。
var 並不是說明類型不確定,更像是表明「我懶得寫這個類型是什麼了,編譯器你幫我瞧瞧」。在編譯時,var 所標識的變數的類型是確定的。智能感知還可以在沒編譯的時候就告訴你這個變數推斷出什麼類型,直接在下文使用var 的變數時,智能感知也會告訴你它有什麼成員var s = "string";
s = s / 100; // 編譯時錯誤
順便一提,C#里確實是有編譯時不定類型的變數的,標識是dynamicdynamic s = "string"s = s / 100; // 通過編譯,但運行時引發異常這個不是動態類型,只是自動類型推導。
強類型不代表類型一定要顯式聲明.說白了人們需要強類型其實要的不過就是基於強類型之上的類型自動推斷罷了.
C#既然是一種強類型語言,這就表示每個變數都有固定的類型。所以當使用var聲明變數初始化時,編譯器會在編譯過程中根據合法的右值自動推理出變數所代表的類型。var的產出主要為了實現lmabda表達式吧
類型推斷不是很難的事情,本質上還是編譯器糖。lombok也能給Java提供val這種奇怪又evil的東西(光速逃
var 不算什麼,C#還有 dynamic 關鍵字,那真正的動態類型。
CPP的var運用了自動類型推斷,在編譯期其實是已經確定好變數類型的,和一般的寫法比只不過不需要顯式給出類型
為什麼一堆人分不清強類型, 弱類型, 靜態類型, 動態類型
就算你用var定義變數,它該是啥類型還是啥類型,然後你初始化變數的時候必須給初值,不然確定不了類型。類似的還有C++11的auto
var是強類型啊
推薦閱讀:
※用慣了 C# 之後再也不想用別的語言了,正常嗎?
※要怎麼努力才能達到 vczh 那樣的層次?
※在 C++ 入門之後,是堅持學完並熟悉 C++ 好,還是改學習其他語言好?
※誰能通俗易懂的講解下C#中的集合?
TAG:C# |