我不习惯使用 Var 隐式输入变量。任何人都可以让我知道使用这种变量的优势吗?
答案 0 :(得分:5)
匿名类型:
var person = new { Name = "John", Surname = "Doe" };
答案 1 :(得分:3)
有一件事是它对于长类型来说是一个简短的手......例如:
List<Dictionary<string, object>> myList = getList();
可以简化为:
var myList = getList();
答案 2 :(得分:2)
在正常使用下,'var'完全是可选的,相当于手动指定类型。请参阅here。
然而,anonymous types需要'var'关键字,我通常与LINQ一起使用。
答案 3 :(得分:1)
我特别发现这更容易理解:
foreach(var dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
比这个:
foreach(ISingleResult<usp_GetUserAndAccountDataResult> dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
对我来说,无论我明确定义dbitem
,我都会做同样的动作;所以var
这里是无价的!
而且它的美妙之处在于IntelliSense仍然会在另一端列出所有预期类型的成员(例如我的示例中的UserName
)。
答案 4 :(得分:1)
更好的代码可读性。特别是与构造函数和长类型名称一起使用:
var anArray = new String[3];
var iStream = new InputStream(...);
var dict = new Dictionary<string, int>();
答案 5 :(得分:1)
请注意,使用var并不总是看起来像(尽管主要是)。一个例子是:
dataList是webform上的DataList控件
foreach (var item in dataList.Items)
{
// item is of type System.Object
}
foreach (DataListItem item in dataList.Items)
{
// item is of type DataListItem
}
答案 6 :(得分:0)
我相信它是为了匿名类型而创建的(ala Kugels示例):
var person = new { Name = "John", Surname = "Doe" };
然而,自从我发现它以来,我必须承认,在处理较长类型的名称时,我发现它在日常使用中非常有用,例如:
var aaa = new Dictionary<string, List<ReallyLongTypeName>>();
// vs
Dictionary<string, List<ReallyLongTypeName>> aaa = new Dictionary<string, List<ReallyLongTypeName>>();
另一个副作用是类型名称可以更改(或替换为其他类型),但使用var
的代码不会中断,例如:
var item = this.GetItem();
this.Name = item.Name;
this.Age = item.Age;
只要GetItem的返回值始终具有属性Name
和属性Age
(与this
上的属性兼容),那么GetItems
就可以返回一个完全不同的对象,上面的代码仍然会编译。 (但要小心 - 现有的编译程序集不能使用相同的技巧!)
答案 7 :(得分:0)
除了其他答案之外,对我来说,真正的优势在于处理外部代码,将变量类型与实际方法签名分离。
考虑这个界面:
public interface IFoo
{
List<Foo> GetSomething();
}
并说你有两行代码:
List<Foo> foos = fooRepo.GetSomething();
var foos2 = fooRepo.GetSomething();
以上两行的结果相同。 (List<Foo>
已退回)。
现在如果更改了界面:
public interface IFoo
{
Dictionary<bool,Foo> GetSomething();
}
第一行现在会抛出编译错误,第二行不会:
List<Foo> foos = fooRepo.GetSomething(); // error - can't convert from Dictionary<bool,Foo> to List<Foo>
var foos2 = fooRepo.GetSomething(); // works!
在处理接口契约/方法签名可能发生变化的存储库/其他项目时,这非常方便。
是的,您仍然需要重新编译类,但您不必返回并更改引用旧返回类型的所有代码。