關於隱式型別var使用最佳實踐的討論
C#3.0帶來了一個新的特性隱式型別,使用var關鍵字定義,如:
Int i=2; 就可以寫成var i=2;
編譯器會根據表示式來推斷出顯示的型別。但是並不是所有的情況都適合使用,比如方法過載的時候就會使我們的程式碼很難理解,如下面的例子:
private static int GetUserInput()
{
Random r = new Random(1);
return r.Next();
}
private static int Add(int numberOne, int numberTwo)
{
return numberOne + numberTwo;
}
private static float Add(float numberOne, float numberTwo)
{
return Convert.ToInt32(numberOne + numberTwo);
}
private static void InvokeAdd()
{
var numberOne = GetUserInput();
var numberTwo = GetUserInput();
//...
var addedNumber = Add(numberOne, numberTwo); //version of ‘?Add’¡¥ method is not evident
}
上面的例子中哪個版本的Add被呼叫我們就很難一眼看出
下面是一些最佳實踐
- 應該使用var:
a.匿名型別
var anonymousType = new { Name = "Dilbert" };
b.查詢表示式
var queryExpression = from c in customers where c.Name == "Dilbert" select c;
c.複雜泛型型別
var searchList = new
Dictionary
- 不應該使用var:
a. 已知型別
b. var customer = new Customer(); //Do not use
var numberList = new int[] { 1, 2, 3, 4, 5 }; //Do not use.
c. 常量
var i = 5; //Do not use
d. 簡單表示式賦值
e. var count = customers.Count();//Do not use
var customerName = customer.Name;//Do not use
f. 型別無法推斷
IList
文章的評論中有人提到:var i = 2;和int i = 2;只是編譯器的一個trick而已,比如下面程式碼:
private static
void CreateImplicitInteger()
{
var i = 2;
}
private
static void
CreateExplicitInteger()
{
int i = 2;
}
他們對應的IL是一樣的,如下:
.method private hidebysig
static void CreateImplicitInteger() cil
managed
{
// Code size 4 (0x4)
.maxstack
1
.locals init ([0] int32 i)
IL_0000: nop
IL_0001:
ldc.i4.2
IL_0002:
stloc.0
IL_0003:
ret
} // end of
method Program::CreateImplicitInteger
and
.method private hidebysig
static void CreateExplicitInteger() cil
managed
{
// Code size 4 (0x4)
.maxstack
1
.locals init ([0] int32 i)
IL_0000: nop
IL_0001:
ldc.i4.2
IL_0002:
stloc.0
IL_0003:
ret
} // end of
method Program::CreateExplicitInteger
而且該評論者不同意作者推薦對下面程式碼使用顯示型別,而是鼓勵使用var隱式型別
var customer = new Customer();
因為這裡使用var並不會帶來程式碼的可讀性變差,如果我要改變Customer為一個CustomerBase的基類,
下面改一個地方程式碼.
var customer = new Customer();
下面改兩個地方程式碼
Customer customer = new Customer();
還有人指出:
var numberList = new int[] { 1, 2, 3, 4, 5 }; //Do not use
名字應該為numberArray,應為var不會改變任何東西。
原文地址:http://www.cnblogs.com/carysun/archive/2009/11/05/1596476.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-618281/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【關於Javascript】--- 隱式型別轉換篇JavaScript型別
- 關於 WebRTC API navigator.mediaDevices.getUserMedia 返回型別的討論WebAPIdev型別
- 關於oracle SCN 的討論Oracle
- 關於BSS資料化轉型的幾點討論
- [技術討論]關於低耦合開發的討論
- 關於隱式資料型別轉換的一些試驗資料型別
- 別再被坑了! JavaScript型別檢測的最佳實踐JavaScript型別
- 如何實現隱式型別轉換型別
- 關於aio的設定的討論AI
- 關於部落格評論外掛的討論
- Java 理論與實踐: 關於異常的爭論Java
- 關於神經網路的討論神經網路
- 關於rails和Grails的效能討論AI
- 關於HTTP中文翻譯的討論HTTP
- 關於業務元件相關架構的討論元件架構
- 關於 JS 模組化的最佳實踐總結JS
- 關於 vue 全家桶的四個 “最佳實踐”Vue
- 關於多型實現Singleton模式的探討 (轉)多型模式
- 討論關於Constraint statesAI
- RocketMQ 的消費者型別詳解與最佳實踐MQ型別
- 欄位的資料型別隱式轉換有關係資料型別
- 關於UI的一次討論——來自專案管理群的討論UI專案管理
- 關於一個建立型模式的討論:模式
- 關於string.Empty & "" & null 的討論Null
- 關於專案經理的討論 (轉)
- 討論:十年專案管理最佳實踐與經驗總結專案管理
- JavaScript隱式型別轉換JavaScript型別
- MySQL 隱式型別轉換MySql型別
- C++隱式型別的轉換C++型別
- 資料型別的隱式轉換資料型別
- 有趣的JavaScript隱式型別轉換JavaScript型別
- 【原創】關於JAVA複習的最佳敏捷實踐Java敏捷
- 關於訂單庫存扣減的最佳實踐
- 收藏 | Google 釋出關於機器學習工程的最佳實踐Go機器學習
- 關於分類的線性模型的討論模型
- 粒子群最佳化函式--particleswarm函式的用法與討論函式Swarm
- [Docker]寫 Dockerfile 的最佳實踐理論Docker
- 每刻費用型別對接金蝶雲星空的最佳實踐型別