隐式类型var

本文关键字:var 类型 | 更新日期: 2023-09-27 18:15:42

可能重复:
var关键字在C#中的使用

作为C#的新手,我想知道MS引入var隐式类型变量的动机。文件上写着:

隐式类型的局部变量是强类型的,就像您已经自己声明了类型,但编译器确定了类型。

一些线路进一步:

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

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

假设你正在复习这个循环。

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

与其回顾循环的内容和语义,我会浪费宝贵的时间来寻找项的类型!我更喜欢以下内容:

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

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

隐式类型var

引入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关键字。

我认为一些动机是允许这样的东西-

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

变成这个-

var list = new List<int>();

第二个示例更短,可读性更强,但仍然清楚地表达了代码的意图。有些情况下,它会不那么清晰,但在很多情况下,你会得到简洁而不失清晰。

var对于匿名类型是非常需要的,它们在Linq中使用了一点:

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

由于集合属于匿名类型,因此无法对其进行命名。它具有真实类型,但在编译之前没有名称。