【问题标题】:implicit type var [duplicate]隐式类型 var [重复]
【发布时间】:2011-11-26 11:35:10
【问题描述】:

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

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

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

还有几行:

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

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

假设你正在审查这个 for 循环。

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

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

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

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

【问题讨论】:

标签: c# implicit-conversion var


【解决方案1】:

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

【讨论】:

  • 我认为 OP 意识到它是匿名类型所必需的,并且正在询问它与命名类型的用途。
  • @BoltClock:很好,我添加了一些在 LINQ 之外使用的示例。
  • 是的,var 用于命名类型是个坏主意,它只是节省了输入。添加它是因为匿名类型需要它。
【解决方案2】:

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

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

变成这个-

var list = new List<int>();

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

【讨论】:

  • 如果出于任何原因右侧必须有一个完全限定的名称,这将变得更加有效。
  • 我不买更容易打字作为使用它的理由。 keyboardig 是(好的,应该是)开发软件的核心能力,节省一些击键(尤其是智能感知)并不是那么引人注目。更容易阅读的是这里应该提出的论点。摆脱重复可以提高可读性,这很重要。可打字性不是重点。
  • +1 我同意,多亏了 VS 以及多么棒的输入,打字并不容易,但它确实减少了可能的拼写错误,这很好。但最终它使它更具可读性!
【解决方案3】:

匿名类型确实需要var,在Linq中使用了一点:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多