在与同事讨论了c# 3中var关键字的使用后,我想知道人们对通过var适当使用类型推断的看法是什么?
例如,我很懒地在有问题的情况下使用var,例如:-
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
var更合法的用法如下:-
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
有趣的是,LINQ似乎是一个灰色区域,例如:-
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
结果很明显,因为它将是一个实现IEnumerable的类型,但它并不完全明显,与var声明一个新对象的方式相同。
当涉及到对象的LINQ时,情况就更糟了,例如:-
var results = from item in someList
where item != 3
select item;
这并不比等价的foreach(var item in someList){//…}相当于。
这里有一个关于类型安全的真正问题——例如,如果我们将该查询的结果放在一个接受IEnumerable<int>和IEnumerable<double>的重载方法中,调用者可能会无意中传入错误的类型。
Var确实保持强类型,但问题是,在定义中不立即显示类型是否危险,当重载意味着当你无意中将错误的类型传递给方法时,编译器可能不会发出错误,这种情况会被放大。
Var,在我看来,在c#中是一个很好的东西。任何这样类型的变量仍然是强类型的,但是它从赋值函数的右边得到它的类型。因为类型信息在右侧可用,在大多数情况下,也必须在左侧输入它是不必要的和过于冗长的。我认为这在不降低类型安全性的情况下显著提高了可读性。
From my perspective, using good naming conventions for variables and methods is more important from a readability perspective than explicit type information. If I need the type information, I can always hover over the variable (in VS) and get it. Generally, though, explicit type information shouldn't be necessary to the reader. For the developer, in VS you still get Intellisense, regardless of how the variable is declared. Having said all of that, there may still be cases where it does make sense to explicitly declare the type -- perhaps you have a method that returns a List<T>, but you want to treat it as an IEnumerable<T> in your method. To ensure that you are using the interface, declaring the variable of the interface type can make this explicit. Or, perhaps, you want to declare a variable without an initial value -- because it immediately gets a value based on some condition. In that case you need the type. If the type information is useful or necessary, go ahead and use it. I feel, though, that typically it isn't necessary and the code is easier to read without it in most cases.
在做了十年的Java专业人员之后,我在c#世界里还是个新手。我最初的想法是“哦,不!这就把类型安全丢进了下水道”。然而,我对var了解得越多,我就越喜欢它。
1) Var与显式声明的类型一样是类型安全的。这都是关于编译时语法糖。
2)遵循DRY原则(不要重复)。DRY是关于避免冗余的,在两边都命名类型肯定是冗余的。避免冗余就是要让你的代码更容易修改。
3)至于确切的型号……嗯. .我认为你应该有一个大致的概念你有一个整数,一个套接字,一些UI控件,等等。智能感知将从这里引导你。知道确切的类型通常并不重要。例:我认为99%的情况下你并不关心给定的变量是long还是int, float还是double。对于最后1%的情况,在真正重要的地方,只需将鼠标指针悬停在var关键字上方。
4)我曾看到过这样一种荒谬的观点:现在我们需要回到1980年风格的匈牙利疣,才能区分变量类型。毕竟,在蒂莫西·道尔顿(Timothy Dalton)扮演詹姆斯·邦德(James Bond)的时代,这是判断变量类型的唯一方法。但现在是2010年。我们已经学会了根据变量的用法和内容来命名变量,并让IDE指导我们确定它们的类型。只要继续这样做,var就不会伤害你。
总而言之,var不是什么大东西,但它确实是一个很好的东西,而且它是Java最好很快复制的东西。所有反对的观点似乎都是基于ide之前的谬误。我会毫不犹豫地使用它,我很高兴R#帮助我做到这一点。
好吧,这个问题会一直固执己见,但我会试着给出我的观点-尽管我认为我的观点是如此混乱,你可能不会从中得到什么。
首先——有匿名类型,为此你需要使用“var”关键字来分配一个匿名类型作为类的对象——这里没有太多的讨论,“var”是必要的。
然而,对于更简单的类型,如int型、长型、字符串型等等,我倾向于输入适当的类型。主要是因为它有点像“懒人的工具”,我在这里看不到太多的好处,很少的按键和它可能带来的困惑,这是不值得的。特别是浮点数的各种类型(浮点数、双精度数、十进制数)使我感到困惑,因为我对字面量中的后缀不坚定——我喜欢在源代码中看到类型。
话虽如此,如果类型更复杂和/或它显式地重复在赋值的右侧,我倾向于大量使用var。这可以是一个List<string>或etc,例如:
var list = new List<string>();
在这种情况下,我认为没有必要重复类型两次——特别是当您开始更改代码和类型更改时——泛型类型可能会变得越来越复杂,因此必须更改它们两次只是一种痛苦。当然,如果你希望针对IList<string>编码,那么你必须显式地命名类型。
简而言之,我做了以下事情:
当类型很短或不能脱离上下文读取时,显式地命名类型
在必要时使用var(废话)
当var(在我看来)不影响可读性时,使用它来偷懒