在开发中到底要不要用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:

  1. New object creation expression: var dictionary = new Dictionary<int, string>();
  2. Cast expression: var element = (IElement)obj;
  3. Safe Cast expression: var element = obj as IElement;
  4. Generic method call with explicit type arguments, when return type is generic: var manager = serviceProvider.GetService()
  5. 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)objvar 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中关闭这个提示

在Resharper中关闭var的强制提示

posted @ 2014-11-09 16:00  马非码  阅读(7549)  评论(64编辑  收藏  举报