【发布时间】:2011-05-10 14:55:33
【问题描述】:
除了非人类可读的代码之外,还有另一个理由不为函数中的每个变量使用 var 吗?我的意思是不使用 int、SqlCommand、string 而是使用 var 会影响性能吗?
【问题讨论】:
除了非人类可读的代码之外,还有另一个理由不为函数中的每个变量使用 var 吗?我的意思是不使用 int、SqlCommand、string 而是使用 var 会影响性能吗?
【问题讨论】:
使用或不使用“var” 不改变其他可观察的 程序的特点,例如 作为它的表现。
问题 是否使用“var”铰链 对人类读者的影响 和代码的维护者,而不是 它对编译后的工件的影响。
看看这篇优秀的文章:https://docs.microsoft.com/en-gb/archive/blogs/ericlippert/uses-and-misuses-of-implicit-typing
【讨论】:
var MyCar = FirstCarFactory.MakeCar(); 的语句,以及代码后面的MyCar = SecondCarFactory.MakeCar();。如果两个工厂都返回类型ICar,即使工厂返回的对象实例是不同的类型,代码也会起作用。另一方面,代码将要求工厂返回类型ICar,而不是它们生成的特定类型的对象。如果消费者代码改为...
ICar MyCar = FirstCarFactory.MakeCar();,即使第一家汽车工厂的返回类型是ToyotaPriusHatchback 而不是ICar,它也能正常工作。需要指定变量的类型应该是ICar 而不是ToyotaPriusHatchback,这是因为它将被写在声明之外的其他地方。如果它仅由定义它的行编写,那么如果 MyCar 是 ToyotaPriusHatchback 就好了。
这绝对不会影响性能。 var 实际上不是类型,而是代码中的占位符,这意味着“我不想写出这个变量的类型”。事实上,如果您将鼠标悬停在 Visual Studio 中的文本上,它会显示一个工具提示,指出您认为太长而无法编写的类型!
不过,严肃地说,当您从代码中清楚类型是什么时,您通常应该使用 var,以免其他人在阅读时感到困惑。
【讨论】:
是的,在任何地方都使用var。
我喜欢 var。它为我节省了大量的击键。它帮助我以“使用优先”的方式编写代码,并且使重构更加强大。
类型的名称无关紧要。 Intellisense 告诉我类型可以做什么,这才是最重要的。
即使我知道类型名称,如果智能感知被破坏也对我没有多大帮助,因为我不一定知道仅从类型名称中调用的特定方法或属性。
var 让事情变得更好的一些细节:
这个很大。我经常不记得方法返回什么,但我知道该方法的名称。不得不将返回类型从我的脑海中拉出来让我慢下来。我只写var,用我的输入调用该方法,然后智能感知告诉我返回类型是什么以及我可以用它做什么。
// Imagine a method that creates a return type that gets some generic type from the call arguments
Tuple<TA,TB,TC,TD,TE> Combine<TA,TB,TC,TD,TE>(TA a, TB b, TC c, TD d, TE e);
// GOOD: Call this with var
var combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
// BAD: Without var
Tuple<string, int, bool, Dictionary<int, List<string>>, string> combo = Combine( "Some text", 42, true, new Dictionary<int, List<string>>(), "Other text");
如果我使用var,编译器会立即告诉我该类型在哪里被滥用(也许新的返回类型没有相同的属性名称)。
如果我不使用var,我只会收到有关分配类型失败的错误。然后,我必须将该类型更改为新类型(调用它的每个地方),最后我会收到错误使用该类型的警告。
var 是 C# 发生过的最好的事情之一。
// BAD: No var
Dictionary<int,List<Tuple<int,bool,string>>> ahhhhThatWasDifficult = new Dictionary<int,List<Tuple<int,bool,string>>>();
// GOOD: With var
// I can think of a good name before writing this complex type
var validNameCountDictionary = new Dictionary<int,List<Tuple<int,bool,string>>>();
如果我还没有说服你,那么你别无选择,如果你想使用:
那么,为什么不一路走下去,到处使用var。
我知道它晦涩难懂,但有时我什至会这样做,这样我就可以始终使用 var 并对我的代码保持一致的外观:
var number = (int?) null;
因为我喜欢 var。
附言我有点难过 let 正在替换 Typescript/ES6 中的 var,但是 Javasctipt var !== C# var
【讨论】:
var 说任何新的东西。我不同意强迫编码人员考虑改变类型总是一件坏事。这取决于代码库的文化。在任何地方使用var 的真正价值在于它使类型变得不那么重要,就像无类型语言一样。就是这样。
在为变量检索值的同时没有声明变量的情况很少见。所以var不能在这些情况下有效地使用。
示例 - 调用仅基于传递给它的对象类型的方法。
Derived d = null; // there is nothing to infer the type from
var someInfo = GetInfo(d);
...
// Base is an ancestor of Derived
Info GetInfo(Base b)
{
if (b is Derived) return ...;
if (b is Derived2) return ...;
...
}
也许你也可以这样做:
var d = default(Derived);
或
var d = (Derived)null;
但 IMO 的可读性也更高。我不会为了使用var而这样做。
【讨论】:
关于implicit and explicit typing。 C#.NET 是一种类型化 语言,这意味着您可以定义存储在内存中的数据类型。如果你不定义它,你会降低一些操作的安全性,所以你想尽可能多地显式键入。但是在某些情况下,类型从您的代码中非常明显,因此您可以将其留给编译器来确定变量应该是什么类型,即implicit typing。
没有类型的一个问题是,在内存中,它本质上是一堆 1 和 0,这些数据可能意味着任何东西,所以如果你最初在位置 000001 处输入一个整数,然后尝试将其读取为 Cat (想象一下,这是某种类型),那么您刚刚从记忆中读出的任何内容都没有多大意义。这就是发明类型系统的原因,它可以告诉您将哪些数据存储在哪里,并确保您以人类可以再次理解的方式读回数据,而对于机器而言,它并不真正归根结底,数据是什么。
【讨论】:
var 不会取消类型。它只会让编译器为您选择正确的类型。如果你说var foo = bar(),那么foo还是会被严格键入,只是你不需要键入类型。 (双关语不是有意的,但已注明。)
var完全与显式类型相同。某些操作“不太安全”是什么意思?