我为什么要使用var而不是类型?

IAd*_*ter 149 .net c# resharper coding-style var

可能重复:
ReSharper和var

在我安装了ReSharper后,它要求(通过警告)我尽可能使用var,例如

UnhandledExceptionEventArgs ue = (UnhandledExceptionEventArgs) t;
Run Code Online (Sandbox Code Playgroud)

ReSharper想把它变成

var ue = (UnhandledExceptionEventArgs) t;
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一个版本,有没有理由更喜欢var?更好的性能?什么?或者它只是一种代码风格?

Mar*_*erl 104

这真的只是一种编码风格.编译器为两个变体生成完全相同的内容.

有关性能问题,另请参见此处:

  • 对于它的价值,根据我的个人经验,从来没有理由使用var.如果你不知道从某个函数返回什么类型,那么该函数需要重构,因为它显然太难理解.任何时候由开发人员保存的任何东西都必须由另一个开发人员(通常是一个大三学生)来接收,他们必须花更多的时间来弄清楚一段代码实际上做了什么. (12认同)
  • 我停止使用它,因为另一代开发人员不会停止抱怨它.我的辩护是,如果他们阅读并理解了代码,它没有任何区别.我认为它实际上使事情更容易; 如果你重构代码并且类型发生了变化,你不必更新你对重构的任何内容的引用,如果它改变类型,即减少输入=减少工作. (7认同)
  • 我根本不同意这一点 - 编译器可能会为两者生成相同的字节码,但从代码可读性/维护的角度来看,对于变量的清晰输入肯定更好 - 它避免了歧义并使其更清晰易读所以明白 我找到了这篇文章,因为我也在寻找ReSharper为什么要让我用var替换所有类型变量的答案.我知道现代语言正朝着不打字的方向发展,即使在运行时也让编译器决定 - 但我不得不说,我不一定认为这是一个积极的发展. (4认同)
  • 那是对的.但是我试图在VS2010中使用var关键字,但语法自动完成似乎有时会感到困惑.因此,使用ReShaper可能没有任何缺点. (3认同)
  • 只有Codestyle?我不同意:https://dotnetfiddle.net/FwpqlU (2认同)
  • 完全正确的Robbie,自从我5年前第一次查看C#以来,它就已经逐渐渗透到C#中,这些天我只是偶尔接触C#,但是当我这样做时,我想查找一些东西,我注意到几乎所有文档正在使用vars,这意味着如果您想深入了解代码段,并以另一种方式实现它,祝您好运。自从我开始使用代码以来,我一直强烈反对这些快捷方式。不输入名为变量的变量所节省的秒数始终会因不可读的代码而丢失。我见过无数次。 (2认同)

Jon*_*eet 35

当你说"通过警告"时,你究竟是什么意思?我经常看到它提示你可能想要使用var,但没有像警告一样严厉.

与var没有性能差异 - 代码被编译为相同的IL.潜在的好处在于可读性 - 如果你已经在赋值的RHS中明确了变量晶体的类型(例如通过强制转换或构造函数调用),那么在LHS中获得它的好处是什么?这是个人偏好.

如果您不希望R#建议使用var,只需更改选项即可.关于ReSharper的一件事:它是非常可配置的:)

  • @ 01:我不会说绿灯是"警告".橙色或红色,是......但是绿色? (6认同)

Ale*_*fie 15

正如其他人所说,当您使用以下任一项时,编译代码(IL)没有区别:

var x1 = new object();
object x2 = new object;
Run Code Online (Sandbox Code Playgroud)

我想Resharper警告你,因为[在我看来]比第二个例子更容易阅读第一个例子.此外,需要两次重复该类型的名称是什么?

考虑以下情况,你会得到我的意思:

KeyValuePair<string, KeyValuePair<string, int>> y1 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5));
Run Code Online (Sandbox Code Playgroud)

这样更容易阅读:

var y2 = new KeyValuePair<string, KeyValuePair<string, int>>("key", new KeyValuePair<string, int>("subkey", 5));
Run Code Online (Sandbox Code Playgroud)

  • 我不想使用**var**的原因是,如果我在RHS上返回的类型错误,那么在左侧使用显式类型将会发现错误.如果没有Intellisense,从RHS看这种类型并不总是显而易见的.在上面的例子中,我倾向于添加一个using语句`使用NestedKVP = KeyValuePair <string,KeyValuePair <string,int >> NestedKVP y1 = new NestedKVP("key",new KeyValuePAir <string,int>("subkey") ,5)); ` (12认同)

Hen*_*man 14

这种情况下,它只是编码风格.

var只有在处理匿名类型时才需要使用.
在其他情况下,这是一个品味问题.

  • @ 01我没有说Resharper总是对的.天哪,我没有对此表达任何意见,对或错.不要把话放在我的嘴里.我只是说这是一个建议,对或错,就是这样.它既不强迫任何人做任何事情(强制意味着你别无选择,显然你可以选择忽略它,因此它不会强迫)也不是警告,因为几乎每个人都知道的用户界面中的警告都是黄色的. (11认同)
  • Resharper没有强迫任何东西.这是一个建议.这就是为什么它是绿色的. (7认同)
  • 但像许多像这样的框架ReSharper迫使他的口味;) (3认同)