隐式类型变量

时间:2011-11-26 11:35:10

标签: c# implicit-conversion var

  

可能重复:
  Use of var keyword in C#

相对较新的C#我想知道MS必须引入var隐式类型变量的动机。文档说:

  

隐式类型的局部变量是强类型的,就像你一样   我自己声明了类型,但编译器确定了类型。

进一步说明:

  

在许多情况下,var的使用是可选的,只是一种语法   方便

这一切都很好,但在我看来,这只会引起混乱。

假设您正在审核此循环。

foreach (var item in custQuery){
    // A bench of code...
}

我没有查看循环的内容和语义,而是花费宝贵的时间来寻找项目的类型! 我宁愿选择以下内容:

foreach (String item in custQuery){
    // A bench of code...
}

问题是:我读到隐式类型变量在处理LINQ时有帮助,在其他场景中确实有用吗?

3 个答案:

答案 0 :(得分:5)

引入LINQ时需要var关键字,因此该语言可以为匿名类型创建强类型变量。

示例:

var x = new { Y = 42 };

现在x是一个具有特定类型的强类型变量,但该类型没有名称。编译器知道x.Y的含义,因此您不必像使用反射那样使用反射来获取对象中的数据:

object x = new { Y = 42 };

现在x的类型为object,因此您无法使用x.Y

当与LINQ一起使用时,它可以是这样的:

var x = from item in source select new { X = item.X, Y = item.Y };

x变量现在是IEnumerable<T>,其中T是一个没有名称的特定类型。

由于引入了var关键字,它还被用于使代码更具可读性,并被误用以保存击键。

使代码更具可读性的一个例子是:

var list =
  new System.Collections.Generic.List<System.Windows.Forms.Message.Msg>();

而不是:

System.Collections.Generic.List<System.Windows.Forms.Message.Msg> list =
  new System.Collections.Generic.List<System.Windows.Forms.Message.Msg>();

这是var关键字的良好用法,因为语句中已存在该类型。关键字可能被滥用的情况如下:

var result = SomeMethod();

由于SomeMethod名称并未表明它返回的类型,因此变量的类型并不明显。在这种情况下,您应该写出类型,而不是使用var关键字。

答案 1 :(得分:2)

我认为一些动机是允许这样的事情 -

List<int> list = new List<int>();

要变成这个 -

var list = new List<int>();

第二个例子更短,更易读,但仍清楚地表达了代码的意图。有些情况会不太清楚,但在很多情况下,你会得到简洁而不会失去清晰度。

答案 2 :(得分:1)

对于匿名类型,确实需要

var,在Linq中使用了一些:

var results =
    from item in context.Table
    select new {Name=item.Name, id=item.id};

由于集合是匿名类型,因此无法命名。它具有一个真实类型,但在编译之前没有一个具有名称的类型。