精選文章

網站搬遷

 Hello all, 許久沒有寫部落格的習慣,未來會持續地在  https://alanzhan.dev/  更新

[C#] Effective - 01 偏好隱含型別的區域變數

甚麼? var?
我非常討厭var!
尤其是不能肉眼從右側直接推斷左側型別的時候!
使用var,到底是好還是壞?

1. 程式可讀性

我曾看過一本書,不過我已經忘記書名,慘了老了...。
書中有提點到,盡量不要使用 var,我讀完之後,我寫的Code從此之後,再也沒寫過var了!
舉幾個例子好了!

var value1 = "HelloWorld";
var value2 = 27M;
var value3 = 7;
var value4 = new MyType();

好,從上述的例子可以看出,value1為 String型態,value2為Decimal型態,value3為Int32型態,value4為MyType型態,到目前為止,人類的肉眼還是可以很快速地辨別出型態!

但是但是...,問題來囉!

問題一

var result = SomeObject.DoSomeWork();

有人可以告訴我上面會回傳的值會是甚麼型別嗎?
應該沒有人可以回答我吧?
都要應該要跳入該方法,查看原始碼才會知道!

問題二

var result = GetMagicNumber();
var total = 100 * f / 6;

請問total會是多少呢?
假設result回傳值為1,那麼total的值就會是16。
那我們在悲觀一點看待上訴的Code,如果GetMagicNumber方法,是一個大家共用的底層呢?
今天有位開發者修改了此方法,將回傳值的型態修改為Decimal呢?
total的值會是16.666666666666666666666666667,但是更慘的問題來了,修改完畢後,重新編譯,因為是var,所以編譯時不會引發任何錯誤,可以順利編譯成功,此時你交付編譯後的程式碼給客戶使用,嘿嘿嘿...,準備接客訴電話吧!

2. 效率問題

問題一

Int32 i = 1;
var i = 1;

請問執行速度較快?
我猜大家都會選擇Int32對吧?
答案並非如此...,var i = 1;的執行速度較快!What? 滿滿黑人問號!
有興趣的人可以點此連結,下方有附贈原始碼提供測試!


欸?科技日新月異,看到這邊都想放棄人生了!
如果用.Net Core 跑出來的結果更噁心,var的耗時會是Int32的一半!

問題二


此程式有著嚴重的效能問題!
q.Where,沒有呼叫Queryable.Where,而是呼叫Enumerable.Where,詳情大家可以自己Google看看!

應該將程式碼修改成下面那樣!
此時 q 的型態為IQueryable<String>,Where句子會保存更新的更完整的表達示樹!


總結

「偏好」使用而非「總是」使用!

看完這個章節後,我還是覺得盡量少寫var,而非永遠不使用var!
畢竟現在電腦的速度越來越快,幾毫秒、幾奈秒的運算時間,為了方便維護程式碼,還是多打幾個字讓後人能快速閱讀程式碼,較為實在,這是我的論點,若有問題歡迎底下留言討論囉! ^__^

講了這麼多!

var到底用還是不用呢?

留言

這個網誌中的熱門文章