使用隐式类型的局部变量

M4N*_*M4N 64 c# coding-style implicit-typing

我刚刚安装了ReSharper的试用版,我注意到的第一件事就是它总是建议用隐式类型的替换显式类型的局部变量,例如:

public string SomeMethod(int aParam)
{
    int aNumber = SomeOtherMethod(aParam);
    // should be changed to:
    var aNumber = SomeOtherMethod(aParam);
}
Run Code Online (Sandbox Code Playgroud)

我认为显式类型变量更具可读性(更明确).

您如何看待ReSharper的建议?使用隐式类型变量有什么优势吗?你什么时候使用implicit/explict vars?

Ren*_*ene 74

我个人只使用"var",因为我可以通过阅读声明来清楚地区分变量Type,例如:

var someVariable = new List<int>();
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,很明显"var"指的是"List <int>".

我不想使用"var",当我必须去一些方法定义来找出变量类型"var"表示什么或者必须依赖visual studio intelli-popup或任何被调用的东西时,例如对我不好:

var someVaraible = SomeMethod();
Run Code Online (Sandbox Code Playgroud)

我的意思是,什么是"SomeMethod"函数应该返回?你能看一下代码行吗?不,你不能,所以这就是为什么我避免在这些情况下使用"var".


Raz*_*zie 40

关于这一点有很多讨论,但我认为这完全归结为个人品味,就像几乎在所有地方使用'this'关键字一样.

个人更喜欢明确的类型变量,但是当使用嵌套的泛型集合时,使用隐式类型变量可以使事物更具可读性.看着:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();
Run Code Online (Sandbox Code Playgroud)

VS:

var myDictionary = new Dictionary<string, Dictionary<string, string>>();
Run Code Online (Sandbox Code Playgroud)

编辑:这个SO主题涵盖相同的主题,一些很好的回复:使用什么:var或对象名称类型?

编辑2:现在使用异步工作很多,我发现使用明确类型的变量有时可以防止讨厌的错误.考虑这个愚蠢的例子,你想要返回用户的Id.还要考虑GetUserAsync返回a Task<User>.如果使用隐式类型变量,最终会使用如下内容:

public long GetUserId()
{
  var user = GetUserAsync();
  return user.Id;
}
Run Code Online (Sandbox Code Playgroud)

编译,但这是错误的.'用户'实际上是一个Task<User>.它编译Task也有一个Id属性.在这种情况下,人们会意外地返回任务的Id而不是用户.

public long GetUserId()
{
  User user = GetUserAsync();
  return user.Id;
}
Run Code Online (Sandbox Code Playgroud)

上面没有编译,因为编译器会抱怨你不能将任务强制转换为用户.添加await关键字当然解决了这个问题.

我实际上有过这种情况曾经发生在我身上:-)


uli*_*i78 17

如果有些人还没有注意到,你可以轻松地更改Reshaper中的"建议"(重塑器 - >选项 - >语言 - >上下文操作 - >"用'var'替换显式类型规范").

我个人更喜欢在任何地方都有明确的类型规格,但我并不是太挑剔.

  • 另一个禁用选项是:代码检查==>检查严重性==> C#==>当初始化程序显式声明类型时使用'var'关键字并尽可能使用'var'关键字 (3认同)

Dan*_*nry 6

有时候输入var pseudo-keyword比使用庞大的类型名称更容易,特别是如果涉及泛型.但是,您应该知道它们在功能上是相同的.两种方式都没有任何性能差异.编译器派生赋值右侧的类型,并用该类型替换var.它不像VB变种那样在运行时发生.


Dus*_*ell 6

FWIW,var关键字在很多情况下都是可读的.特别是如果......

  1. 赋值的右侧是构造函数表达式.

    var map = new Dictionary>();

  2. 局部变量有很好的名字.

HTH