.net framework新特性之隱式型別化的變數
var x=5;
使用這個語句時,編譯器會使用5來確定該變數的型別。這表示,該語句實際上應該如下表示:
int x=5;
隱式型別化的變數是強型別的,在編譯器第一次編譯後var就會被確定的型別所替代的.
隱式型別化的變數關鍵字與js中的var:
javascript是弱型別的語言,而且javascript中的變數(也包括用var宣告的變數)可以變換型別,如下面的javascript所示:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->var s = "abcd";
s=3;
alert(s);
上面的程式碼第一次給s賦了一個字串,而第二行程式碼又給賦了一個整數。這樣的程式碼在javascript中沒有任何問題。但在C#3.0中,var變數一但被初始化,確定型別後,就無法改變型別了。如下面的程式碼是無法編譯通過的:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->var ss = "abcd";
ss = 44;
綜上所述,在使用var定義變數時有以下四個特點:
1. 必須在定義時初始化。也就是必須是var s = “abcd”形式,而不能是如下形式:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->var s;
s = “abcd”;
它是編譯器根據上下文推斷出來的,所以所有一切不能被編譯器推斷出來的用法都是錯誤的。比如不能這樣使用:var nullValue = null;因為null啥也不是,他是一個空指標,是一個不確定的東西。也不能這樣使用:var I = 5;I = “abc”;編譯器根據第一個賦值會推斷出它是一個整型,但是隨後又將一個字串賦值給它,這是怎麼回事呢?
2. var要求是區域性變數。
3. 使用var定義變數和object不同,它在效率上和使用強型別方式定義變數完全一樣。但筆者建議如果事先知道變數的型別,儘量使用強型別方式來宣告變數。否則,就會造成由於大量使用var,而使得開發人員很難斷定某個變數是什麼型別。這樣不利於程式的維護和升級。(只在編譯器可推斷而人不可推斷的時候才使用隱式型別區域性變數,靠我們人工可以推斷的還是不建議使用,顯式的宣告變數型別可以增強程式碼的可讀性,這是一個好的程式設計習慣,不要因為C# 3.0提供了這樣的特性就大用而特用。)
雖然var有利有弊,但筆者個人認為,如果將動態語言轉換成C#語言,可以考慮使用var來定義變數。這是因為動態語言沒有型別,而要將其轉換成強型別的C#語言,就必須給變數指定個型別,但事先確定型別是很費勁的,不如將其指定成var,再由C#編譯器去確定變數的具體型別。那麼如果在轉換的過程中,發現動態語言的變數改變了型別,該怎麼辦呢?這個可以使用“匿名類”來解決這個問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-591957/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 8 新特性之持久化全域性變數的修改MySql持久化變數
- C# 9.0 新特性之目標型別推導 new 表示式C#型別
- .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念與區別Framework
- python學習之變數型別Python變數型別
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- .NET Framework 4和.NET Framework 4 Client Profile的區別Frameworkclient
- 開心檔之Java 變數型別Java變數型別
- Python學習四之變數型別Python變數型別
- .NET 5 中的隱藏特性
- JavaScript隱式型別轉換JavaScript型別
- .NET3.5新特性,Lambda表示式
- 【轉】Spring Framework 5.0 新特性SpringFramework
- ABP Framework 5.0 RC.1 新特性和變更說明Framework
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- 淺談變數型別之外的變數命名變數型別
- Laravel 5.8 新特性和新變化 — 影片Laravel
- PHP變數型別PHP變數型別
- Java 變數型別Java變數型別
- 變數型別-Set變數型別
- Python 3 新特性:型別註解Python型別
- Java 10新特性:型別推斷Java型別
- .NET 8.0 中有哪些新的變化?
- PLC結構化文字(ST)——變數型別和變數屬性變數型別
- C語言的隱式型別轉換C語言型別
- c++中的變數型別_C ++中的變數C++變數型別
- 前端面試官必問系列之隱式型別轉換前端面試型別
- C#10新特性-全域性和隱式usingsC#
- 建構函式定義的隱式型別轉換函式型別
- 【Java】Java新特性--Records記錄型別Java型別
- Rust的變數型別__Data typeRust變數型別
- react 報錯 元素隱式具有 "any" 型別,因為型別為 "string" 的表示式不能用於索引型別 "{}"。 在型別 "{}" 上找不到具有型別為 "string" 的引數的索引簽名。React型別索引
- 寫給.NET開發者的Python教程(二):基本型別和變數Python型別變數
- Dart4Flutter -01– 變數, 型別和 函式DartFlutter變數型別函式
- 變數型別轉換變數型別
- 資料型別,變數資料型別變數
- JavaScript - 變數、值、型別JavaScript變數型別
- c++隱式型別轉換存在的陷阱C++型別
- 型別的本質:對變數、型別、指標的理解型別變數指標
- .NET 7新特性