[問題] 使用var的時機

看板C_Sharp (C#)作者 (大魯蛇)時間9年前 (2014/08/17 21:52), 9年前編輯推噓12(12050)
留言62則, 12人參與, 最新討論串1/1
各位先進大家好 今天在msdn上面看到一段 http://msdn.microsoft.com/zh-tw/library/ff926074.aspx 當指派右邊的變數型別很明顯,或是不需要精確的型別時,使用隱含型別的區域變數。 也就是說,如果我宣告一個string的變數 不應該寫成 string a = "123"; 而是要寫成 var a = "123"; 想請教一下為什麼要這樣? THX -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.61.164.195 ※ 文章網址: http://www.ptt.cc/bbs/C_Sharp/M.1408283550.A.153.html

08/17 22:05, , 1F
08/17 22:05, 1F

08/17 22:07, , 2F
不過我個人不建議這樣寫, 如果該變數非用過即丟,
08/17 22:07, 2F

08/17 22:08, , 3F
保留完整的型別,在未來個人,或是團隊開發時,會比較清楚
08/17 22:08, 3F

08/17 22:09, , 4F
^^維護
08/17 22:09, 4F

08/17 22:10, , 5F
謝謝樓上回覆
08/17 22:10, 5F

08/17 22:11, , 6F
用 linq 的時候
08/17 22:11, 6F

08/17 22:55, , 7F
超討厭人家寫 var,很難看
08/17 22:55, 7F

08/17 23:50, , 8F
當你懶的時候
08/17 23:50, 8F

08/18 00:32, , 9F
寫完整型別不會錯, var 的最佳用途應該是型別名很長可是
08/18 00:32, 9F

08/18 00:33, , 10F
變數生命期其實超短(例如在迴圈裡)寫一堆也沒意義時
08/18 00:33, 10F

08/18 10:09, , 11F
我反而是喜歡用var多一點,因為多半時候VS會幫你判斷
08/18 10:09, 11F

08/18 10:10, , 12F
真的想不起來的時候滑鼠動一下就能看到型別了
08/18 10:10, 12F

08/18 12:43, , 13F
LongClassName = new LongClassName() 的時候,寫var看起來
08/18 12:43, 13F

08/18 12:44, , 14F
差不多啊,這種時候寫完整型別很多餘
08/18 12:44, 14F

08/18 14:58, , 15F
C#是強型別語言,所以你可以不用多花精神管變數的型別
08/18 14:58, 15F

08/18 14:59, , 16F
可以多花時間在表達自己的商業邏輯。當程式碼寫得像是英文
08/18 14:59, 16F

08/18 15:00, , 17F
文章。無論是在驗證邏輯或是日後維護,都有數不盡的好處。
08/18 15:00, 17F

08/18 15:31, , 18F
wcf和linq時會覺得var很好用
08/18 15:31, 18F

08/18 21:27, , 19F
VS 當然會幫你判斷,但是做為一個擁有速讀技能的程式
08/18 21:27, 19F

08/18 21:28, , 20F
開發者,var 無疑是讓閱讀時間從 logN 上升到 N^2
08/18 21:28, 20F

08/18 21:30, , 21F
就像在閱讀一篇沒有標點符號的文章,讀得懂,讀得慢
08/18 21:30, 21F

08/18 21:40, , 22F
型別名稱長,有 intellisense 幫忙,不成問題吧
08/18 21:40, 22F

08/19 07:09, , 23F
阿有些時候就是不知道型別啊 不用 var 要填啥?
08/19 07:09, 23F
先謝謝大家的回應,不過我指的是,很清楚型別要用var,經由上面一些版有 的回應我也可以了解是為什麼了 ※ 編輯: BigLoser (60.249.104.106), 08/19/2014 08:19:46

08/19 20:00, , 24F
我還以為不知道型別時應該填 dynamic
08/19 20:00, 24F

08/20 11:12, , 25F
但是dynamic的話執行時才會知道錯在哪,var的話編譯就
08/20 11:12, 25F

08/20 11:12, , 26F
會告訴你問題出在哪了
08/20 11:12, 26F

08/20 19:17, , 27F
var是知道型別,只是寫出來沒好處的時候用的
08/20 19:17, 27F

08/25 14:44, , 28F
重點不是var, 而是var後面object的命名...才是好讀的關鍵
08/25 14:44, 28F

08/25 14:46, , 29F
有些人說寫成不要用var比較好讀, 但宣告才一行, 使用才是
08/25 14:46, 29F

08/25 14:48, , 30F
重點。好讀的code應該是看到function name和object name就
08/25 14:48, 30F

08/25 14:48, , 31F
大概知道它在做什麼才對。
08/25 14:48, 31F

08/25 16:08, , 32F
變數名稱表示其用途,跟變數型別是兩回事...
08/25 16:08, 32F

08/25 16:22, , 33F
這樣說好了,宣告後要怎麼取得instance?
08/25 16:22, 33F

08/25 16:23, , 34F
1. new: class都寫在後面了,前面宣告還寫出來有什麼意義?
08/25 16:23, 34F

08/25 16:24, , 35F
2 工廠: 你不知道工廠建出來的東西是什麼? 那要不是工廠設
08/25 16:24, 35F

08/25 16:24, , 36F
計有問題, 就是連工廠是哪個工廠都搞不清楚了。
08/25 16:24, 36F

08/25 16:26, , 37F
3. 其他method return: 光看method name還不夠清楚?那要
08/25 16:26, 37F

08/25 16:26, , 38F
不是真的很容易混淆,就是method name取得不好。
08/25 16:26, 38F

08/25 16:29, , 39F
絕對會有容易混淆的部分,那寫明白當然是必須的。但這就好
08/25 16:29, 39F

08/25 16:29, , 40F
像註解一樣,每行都註解的code是好code?我不那麼認為。
08/25 16:29, 40F

08/25 16:36, , 41F
函數名稱表示其用途,跟回傳型別一樣是兩回事...
08/25 16:36, 41F

08/25 16:40, , 42F
沒有人說他是同一回事,但很多情況下不影響你讀code。
08/25 16:40, 42F

08/25 16:43, , 43F
既然知道不是同一件事情,就別扯著一起講..
08/25 16:43, 43F

08/25 16:45, , 44F
真奇怪了, 這有什麼不適合一起說的?你只是在排斥別人的想
08/25 16:45, 44F

08/25 16:45, , 45F
法而已。
08/25 16:45, 45F

08/25 16:50, , 46F
嘿,我不是反對變數/函數名稱最好能適切表達其用途喔
08/25 16:50, 46F

08/25 16:51, , 47F
拿你轉的那一篇來說,裡面有var order=GetOrder(orderId);
08/25 16:51, 47F

08/25 16:52, , 48F
我覺得這樣一行就再清楚不過了。不需要特別去Order order=
08/25 16:52, 48F

08/25 16:53, , 49F
當然,若有好幾種Order(也就是容易混淆),明確寫出來當然
08/25 16:53, 49F

08/25 17:01, , 50F
所以你的確知道變數名稱order跟函數名稱GetOrder的命名,
08/25 17:01, 50F

08/25 17:02, , 51F
和前面的 var 或 Order 或 OOXXOrder 或 KKVVOrder,
08/25 17:02, 51F

08/25 17:03, , 52F
對於可讀性來說, 是兩回事
08/25 17:03, 52F

08/25 17:13, , 53F
怎麼會是兩回事?例如var order = getOrder()最直覺就應該
08/25 17:13, 53F

08/25 17:15, , 54F
認知它是個Order type。若是違反這個直覺,那是應該寫明白
08/25 17:15, 54F

08/25 17:24, , 55F
當專案規模夠大,保留完整型表,在未來個人維護,
08/25 17:24, 55F

08/25 17:25, , 56F
或是團隊開發時,會比較清楚
08/25 17:25, 56F

08/25 17:26, , 57F
變數名稱跟函數名稱是沒辦法完整解答"var"跟完整型別的
08/25 17:26, 57F

08/25 17:27, , 58F
表 => 別 typo
08/25 17:27, 58F

08/25 18:45, , 59F
Order order = getOrder(); 這樣世界不是很美好嗎??
08/25 18:45, 59F

08/26 16:48, , 60F
其實另一個我喜歡打var的原因是少打一次物件名就少一次
08/26 16:48, 60F

08/26 16:48, , 61F
因為胖手指而出錯的可能性
08/26 16:48, 61F

08/27 17:36, , 62F
大部份情況var是因為我懶(遮臉
08/27 17:36, 62F
文章代碼(AID): #1JyBEU5J (C_Sharp)
文章代碼(AID): #1JyBEU5J (C_Sharp)