在开发中到底要不要用var?
var是.net的一个语法糖,在Resharper中推荐都使用这个关键字,平常我也是经常用;但是在跟其他程序员推广使用时,他的一些考虑引发了我的深思,到底该不该使用这个关键字呢?
我使用的理由
我使用的理由很简单
简化输入。这个真的很方便,你想想你new一个对象的时候,或者通过一个方法的时候,还得想想这个对象的类型是什么,尤其是像这种复杂的类型:
Func<Dictionary<Model.User,List<Model.Roles>>,int> test=new Func<Dictionary<Model.User,List<Model.Roles>>,int>(),用起来得有多辛苦?Resharper强制的时候,你看着Resharper的推荐,总是忍不住的点一下,结果整个VS都是var的类型了
强迫症。如果用各种类型,在new的时候左边总是对不齐,但是用var就不同了
var obj1=new List<Model.User>();
var obj2=new Dictionary<int,Model.Department>();
左边对的多齐是不?
不使用的理由
同事给我的理由是:用这个关键字,你就没法知道一个这个对象的类型了,尤其在记事本打开的时候,很不爽。只有用vs打开的时候,通过智能感知才知道。
这确实是个问题,我一时也不能反驳。但是隐隐约约我又感觉有点不对。我用这么久了,也没什么问题是不,也没有感觉到使用不方便啊。话说了,开发C#的,有几个又不打开VS的?
让我们看看老外是怎么看的
在文章To var or not to var – c# implicit variable declaration中提到:
What are the benefits of using var
- Dont Repeat Yourself (DRY) – Redundant code should be avoided.
- Faster creation of code
- Calls for improved naming of variables – can work as a reminder for descriptive naming
- Improved readability – in some cases (where the repeated type is long and complex)
- Less code modification if you later need to change the type
- Clearer distinction of when you really want to specify the type
The disadvantages of using var
- Loss of readability – in some cases (where the type isn’t obvious)
- Changes to the type could introduce bugs which the compiler otherwise would have caught for the developer
Conclusion:
In my opinion the var keyword should certainly be used with care, but redundant declarations should be avoided. Therefore it would be preferred to use implicit declarations wherever it’s appropriate, i.e where the type is clear and obvious. Consistency shouldn’t be neglected, but I believe most developers in an organisation would identify the same situations where the type is ambigous.
In the end it’s really about finding a sensible balance. If keeping in mind to use var to avoid repetition and obvious type declarations, the answer is pretty clear of when to var or not… where the type is reasonably obvious.
在文章“WHAT ADVANTAGES DOES USING VAR HAVE OVER THE EXPLICIT TYPE IN C#? [DUPLICATE]”有人是这么认为的:
The point of var is to allow anonymous types, without it they would not be possible and that is the reason it exists. All other uses I consider to be lazy coding.
你是想懒点,还是想累点?
这篇文章总结得也不错“C# 3.0 Implicit Type Declarations: To var or not to var?”
Some cases where it seems just fine to suggest var are:
- New object creation expression: var dictionary = new Dictionary<int, string>();
- Cast expression: var element = (IElement)obj;
- Safe Cast expression: var element = obj as IElement;
- Generic method call with explicit type arguments, when return type is generic: var manager = serviceProvider.GetService()
- Generic static method call or property with explicit type arguments, when return type is generic: var manager = Singleton.Instance;
Infoq中有篇文章研究得比较深入:“C# Debate: When Should You Use var?”
Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types.
但是,有人提出了另外的意见:
Chris Sutton seems to go further and implies that the type really doesn't matter.Then the suggestion came up that you should only use var when you don’t know the type. Here is where I differ in opinion and usage. Look at the following snippet
var procs = from p in ServiceController.GetServices()
where p.Status == ServiceControllerStatus.Running
select p;
procs.ToList().ForEach(p=> Console.WriteLine(p.ServiceName));
procs is certainly IEnumerable but it doesn’t matter to me. I primarily care that procs is a list and that the individual items in the list have a Property called ServiceName. The underlying type is important to the compiler, but the people that have to read code aren’t compilers right?
总结
使用var可以:
- 减少编程语言中的重复工作(DRY)
- 减少编程中的噪声干扰
- 减少编码
- 在某些情况下,会提升可阅读性
因此在以下情况,建议使用var
- 当你能够通过一个声明明确的看到类型时。如:
var dic=new Dictionary<int,List<string>>();、var element = (IElement)obj、var element = obj as IElement - 使用泛型时:
var manager = serviceProvider.GetService<IManager>()、var manager = Singleton<Manager>.Instance - 当你使用匿名类时:
var person = new { Name = "Peter", Age=4};
其他情况下建议还是书写完全的类型名称,因为过度使用var,会减低整体代码的可读性,尤其在没有IDE的智能提示的情况下,用var可能会导致阅读代码的人的困惑。
如何在Resharper中关闭这个提示

在开发中到底要不要用var?的更多相关文章
- MyBatis 项目开发中是基于 XML 还是注解?
只要你对 MyBatis 有所认识和了解,想必知道 MyBatis 有两种 SQL 语句映射模式,一种是基于注解,一种是基于XML. 基于 XML <mapper namespace=" ...
- 【Android进阶】在开发中Application到底用来做什么
首先,在一个Android程序中,有且只有一个Application对象,在程序开始跑起来的时候,首先执行Application的onCreate方法,这是一个Android应用的入口,在开发中,我们 ...
- 开发中,GA、Beta、GA、Trial到底是什么含义
前言 用过maven的都应该知道,创建maven项目时,其版本号默认会以SNAPSHOT结尾,如下: 通过英文很容易就可以知道这是一个快照版本.但是,在开发中,或者使用别的软件的时候,我们常常会见到各 ...
- 一个简单的特效引发的大战之移动开发中我为什么放弃jquery mobile
我本想安静的做一个美男子,可是,老板不涨工资,反而,一月不如一月. 我为什么放弃jquery mobile插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...
- 彻底理解和解决移动WEB开发中CLICK点透问题
在移动WEB开发中,有时候可能会出现点透问题,本文将围绕这个TAP点透问题,详细的讲述到底什么是点透,为什么会出现点透,如何避免出现点透,如果不可避免的出现了,如何解决解决移动WEB开发中CLICK点 ...
- web开发中移动端适配
这个话题有些复杂,说起来有些琐碎,因为和移动端适配相关的问题太多了. 1. 概念 1.1 设备像素 设备像素被称为物理像素,它是显示设备中一个最小的物理部件.每个像素可以根据操作系统设置自己的颜色和亮 ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
随机推荐
- Fis3前端工程化之项目实战
Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...
- Xamarin+Prism开发详解五:页面布局基础知识
说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...
- pt-online-schema-change中update触发器的bug
pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...
- 深入解析Sqlite的完美替代者,android数据库新王者——Realm
写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...
- springmvc 多数据源 SSM java redis shiro ehcache 头像裁剪
获取下载地址 QQ 313596790 A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:31359679 ...
- js 入门级常见问题
写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...
- 服务治理要先于SOA
讲在前面的话: 若企业缺乏对服务变更的控制和规则,那么一个服务在经过几个项目之后,就很有可能被随意更改成多个版本,将来变成什么样更是无法预测.久而久之,降低了服务重用的可能性,提高了服务利用的成本 ...