2010-11-18 42 views
3

我不习惯使用Var隐式类型变量。任何人都可以让我知道使用这种变量的好处吗?任何隐含使用类型的优点var

+0

虽然从技术上讲,你问了一个不同类型的问题,请看[任何](http://stackoverflow.com/search?q= [C%23] + var)的其他问题和答案关键字'var'。你的问题可能会被认为是[this]的一个重复项目(http://stackoverflow.com/questions/1430831/anyone-found-a-use-of-var-other-than-for-linq)。 – 2010-11-18 02:23:54

+1

我想知道是否可以通过将标题中的偏见换成“任何优势来明确拼出类型?”来获得不同的答案。 :-) – 2010-11-19 00:35:39

+0

[在C#中使用var关键字]的可能重复(http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal 2014-07-15 14:31:00

回答

3

一件事是,它是long类型手短......如:

List<Dictionary<string, object>> myList = getList(); 

可以简化为:

var myList = getList(); 
+1

只需交换现有代码与var,它可以回来,咬你。考虑一下:var list = new List (); list.Reverse(); ---然后--- IList list = new List (); list.Reverse();这两个示例都编译得很好,但只有第一个示例实际上会颠倒列表的内容。在第二个示例中,编译器将在IEnumerable上使用Reverse()扩展方法,它的不可变性意味着它返回一个反转列表,而第一个示例修改列表。 – 2010-11-18 03:09:38

+1

或者相反:IList list = new List (); list.Reverse()FirstOrDefault(); ---然后--- var list = new List (); list.Reverse()FirstOrDefault();在第二个例子中,编译器会失败,因为var会推断具体的类List,它已经有一个Reverse()方法,而它将在第一个例子中使用扩展方法。所以var也可能有点棘手。 – 2010-11-18 03:21:14

5

Annonymous类型:

var person = new { Name = "John", Surname = "Doe" }; 
2

在正常使用情况下,'var'完全是可选的,等同于手动指定类型。请参阅here

但是,'var'关键字是anonymous types所必需的,我通常将它与LINQ结合使用。

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这里是无价的!
它的美妙之处在于,智能感知仍然会在另一端列出所有预期类型的​​成员(例如我的示例中的UserName)。

1

更好的代码可读性。

var anArray = new String[3]; 
var iStream = new InputStream(...); 
var dict = new Dictionary<string, int>(); 
+0

即使对于应该初始化为空值的变量,您也可以使用var关键字,如下所示:var dict = default(Dictionary ); – 2010-11-18 03:14:02

+0

可读性的思想取决于。在你上面的例子中,这是真的。这更可读。但是,在您调用返回接口或类型不明确的函数的情况下,可能很难知道 - 未审查相关方法 - 您处理的是哪种类型,因此,我认为这不太可读。不是没有理由不使用var,但我不使用它,因为它可以单独读取...... – 2014-05-20 15:53:58

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>>(); 

另一个副作用是,类型名称可以改变(或与其他T为取代YPES),但使用var不会”断裂,例如代码:

var item = this.GetItem(); 
this.Name = item.Name; 
this.Age = item.Age; 

只要从的GetItem返回值总是有一个属性Name和属性Age(其与this属性兼容),则GetItems可以返回一个完全不同的对象,上面的代码仍然可以编译。 (但要小心 - 现有的编译程序集不能使用相同的技巧!)

1

请注意,使用var并不总是它看起来(虽然主要是)。一个例子是这样的:

DataList控件是一个WebForm

foreach (var item in dataList.Items) 
{ 
    // item is of type System.Object 
} 

foreach (DataListItem item in dataList.Items) 
{ 
    // item is of type DataListItem 
} 
+0

这只是因为在泛型之前的.net 2世界存在,而不是var关键字的限制。很高兴看到MS重新访问所有这些集合,并为它们添加一个IEnumerable接口。 – 2010-11-18 02:57:34

0
从其他的答案

除了DataList控件,给我一个真正优势与外部代码打交道时,去耦变量类型实际的方法签名。

考虑这个接口:

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! 

与库/其他项目时,这是非常方便的界面合同/方法签名可以改变。

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

+0

如果外部库更改了它们的签名,您仍然需要重新编译所有库,因为在编译时var将被转换为具体类型,而后者将不再匹配。我仍然同意,在没有任何代码变化的情况下进行简单的重新编译是很好的,但只是为了清楚起见,因为可以通过阅读最后一行来得到var在运行时级别上的作用。 – 2010-11-18 03:00:08

+0

是的 - @BurningIce,优点。是的,你需要重新编译 - 我所做的一点是你不需要回去修改所有的代码。 – RPM1984 2010-11-18 03:06:30

相关问题