隐式使用var的任何优点

时间:2010-11-18 02:03:50

标签: c# .net

我不习惯使用 Var 隐式输入变量。任何人都可以让我知道使用这种变量的优势吗?

8 个答案:

答案 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!

在处理接口契约/方法签名可能发生变化的存储库/其他项目时,这非常方便。

是的,您仍然需要重新编译类,但您不必返回并更改引用旧返回类型的所有代码。