使用隐式types局部variables
我刚刚安装了ReSharper的试用版本,我注意到的第一件事情是,它总是build议用隐式types的types来replace显式的局部variables,例如:
public string SomeMethod(int aParam) { int aNumber = SomeOtherMethod(aParam); // should be changed to: var aNumber = SomeOtherMethod(aParam); }
我认为明确的typesvariables更可读(更明确)。
你对ReSharper的build议有什么看法? 使用隐式typesvariables有什么好处吗? 什么时候使用隐式/显式variables?
我个人只使用“var”,当我可以通过阅读声明清楚地区分variablestypes,例如:
var someVariable = new List<int>();
在上面的例子中,显然“var”指的是“List <int>”。
我不喜欢使用“var”,当我必须去一些方法定义来找出什么variablestypes“var”代表或通过依靠visual studio intelli-popup或任何被称为,例如这在对我不好:
var someVaraible = SomeMethod();
我的意思是,什么是“SomeMethod”函数应该返回? 你能通过查看代码行吗? 不,你不能,所以这就是为什么我避免在这些情况下使用“var”。
这里有很多讨论,但我认为这一切都归结为个人的品味,就像几乎在任何地方使用“这个”关键字一样。
我个人更喜欢明确的typesvariables,但是当使用嵌套的generics集合时,事物可以通过使用隐式typesvariables变得更加可读。 看着:
Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();
VS:
var myDictionary = new Dictionary<string, Dictionary<string, string>>();
编辑:这个SO主题涵盖了相同的主题,与一些不错的回复: 使用什么:var或对象名称types?
编辑2:现在与asynchronous工作很多,我发现使用明确typesvariables有时可以防止讨厌的错误。 考虑这个愚蠢的例子,你会想要返回一个用户的ID。 还要考虑GetUserAsync
返回一个Task<User>
。 如果你使用隐式types的variables,你最终会使用这样的东西:
public long GetUserId() { var user = GetUserAsync(); return user.Id; }
这编译,但它是错误的。 'user'实际上是一个Task<User>
。 它编译为Task
也有一个Id
属性。 在这种情况下,会意外返回一个任务的Id而不是User。
public long GetUserId() { User user = GetUserAsync(); return user.Id; }
上面的代码不会编译,因为编译器会抱怨你不能把任务投给用户。 添加await
关键字当然可以解决这个问题。
我曾经遇到过这种情况:-)
以防万一有人还没有注意到,你可以很容易地改变重构器的“build议”(重构器 – >选项 – >语言 – >上下文操作 – >“用'var'replace显式types说明”)。
我个人比较喜欢在各个地方都有明确的types规格,但是我并不是很挑剔。
有时候inputvar伪关键字比一个巨大的types名称更容易,特别是如果涉及generics的话。 但是,您应该知道它们在function上是相同的。 没有性能差异或任何方式。 编译器派生出赋值右侧的types,并用该typesreplacevar。 它不像VB变体那样在运行时发生。
FWIW,var关键字在许多情况下是可读的。 特别是如果…
-
赋值的右边是一个构造函数expression式。
var map = new Dictionary>();
-
局部variables有很好的名字。
HTH