可能重复:
Use of var keyword in C#
在与同事讨论在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;
这并不比equivilent foreach(var item in someList) { // ... }
等效。
此处存在关于类型安全的真正担忧 - 例如,如果我们将该查询的结果放入接受IEnumerable<int>
和IEnumerable<double>
的重载方法,则调用者可能会无意中传入错误类型。
答案 0 :(得分:2)
就我个人而言,我发现你描述的情况远非有问题,因为除非你特别希望变量的静态类型与用于初始化变量的表达式的静态类型不同,否则没有必要重复自己。例如:
IEnumerable<int> foo = new List<int>(); // It's IEnumerable on purpose
此外, var
绝对没有类型安全问题。关键是不变量可以是“任何”类型。它是一种非常特殊的类型,但你根本不在乎拼出那种类型。
答案 1 :(得分:0)
我只是将它用作占位符,直到我确定我正在使用哪种数据类型。
当然这是一个简短的回答,但我认为你应该使用var关键字时非常接近。
答案 2 :(得分:0)
var关键字在语言中用作速记,但不是.NET类型。编译器必须知道变量的类型才能使用var
关键字 - 因此 类型安全。
我个人仅在分配中使用类型名称时才使用它,并且名称可能在代码中复制太久。
var dictionary = new Dictionary<string, string>();
它也用于匿名类型(但仍然,编译器必须知道匿名类型的签名)。
var fred = new { Age = 23, Name = "Fred" };
此方法常用于LINQ queries的select子句。
答案 3 :(得分:0)
只是一个“抽象”或“语法糖”才能编写代码而不首先指定类型(这不是你的第一个案例)
在第二种情况下:相反,如果你愿意,可以输入一些未知的,动态的,而不是具体的LINQ查询,输入。
可能是:
var results = from item in someList
where item != 3
select item; //item a class instance
可能是
var results = from item in someList
where item != 3
select item.ItemName; //string property of that class
可能是
var results = from item in someList
where item != 3
select new {item.ItemName, item.ID}; //unknown type dynamically generated, that conains the string and integer, like result
答案 4 :(得分:0)
据我所知var
仍然是强类型的。编译器计算出正确的类型应该是什么。事实上,它没有任何实际意义。
减少操作次数只是一种技巧。例如,当您更改一个类中的类型时,这可能会导致一系列修改。但它只是将工作从程序员迁移到编译器的唯一方法。
例如,您的Linq查询将生成类型IEnumerable<TA>
。当您更改某个类时,结果将为IEnumerable<TB>
,则无需更改此部分代码。