【问题标题】:What is the exact use of var keyword? [duplicate]var关键字的确切用途是什么? [复制]
【发布时间】:2012-04-04 19:03:09
【问题描述】:

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

在与同事讨论 C# 3 中“var”关键字的使用后,我想知道人们对通过 var 正确使用类型推断有何看法?

例如,我在有问题的情况下比较懒惰地使用 var,例如:-

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

更合法的var用法如下:-

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

有趣的是 LINQ 似乎有点灰色地带,例如:-

var results = from r in dataContext.SomeTable
               select r; // Not *entirely clear* what results will be here.

很明显,它将是一个实现 IEnumerable 的类型,但它并不像 var 声明一个新对象那样完全明显。

当涉及到 LINQ to 对象时,情况就更糟了,例如:-

var results = from item in someList
              where item != 3
              select item;

这并不比 equivilent foreach(var item in someList) { // ... } 等效。

这里确实存在类型安全问题 - 例如,如果我们将该查询的结果放入接受 IEnumerable&lt;int&gt;IEnumerable&lt;double&gt; 的重载方法中,调用者可能会无意中传入错误的类型。

【问题讨论】:

  • 使用 var you don't have to figure out the type 似乎是一个非常糟糕的使用理由......你应该知道类型是什么,var 只是避免输入它的快捷方式
  • 您是否只是从@Henrik 的重复评论中复制了问题?
  • @Bali C:是的,如果你看看他之前的问题,你会发现一个相当令人不安的模式......
  • @BoltClock 如果他们正在做奇怪的事情,比如复制其他问题等,是否有标记用户而不是评论的方法?只是好奇
  • @Burkely91:标记他们的任何帖子。

标签: c# var


【解决方案1】:

就我个人而言,我发现您所描述的情况远非可疑,因为除非您特别希望变量的静态类型与用于初始化变量的表达式的静态类型不同,否则重复自己没有意义。例如:

IEnumerable<int> foo = new List<int>(); // It's IEnumerable on purpose

此外,var 绝对没有类型安全问题。关键是不是变量可以是“任何”类型。它是一种非常具体的类型,但您根本不关心拼写该类型。

【讨论】:

  • 我认为您在这里一针见血。 +1
【解决方案2】:

我只是将它用作占位符,直到我确定我使用的是哪种数据类型。

当然这是一个简短的答案,但我认为应该使用 var 关键字的时间非常接近。

【讨论】:

    【解决方案3】:

    var 关键字在语言中用作简写,但不是 .NET 类型。编译器必须知道变量的类型才能使用 var 关键字 - 所以它类型安全的。

    我个人只在类型名称也用于赋值并且名称可能太长而无法在代码中重复的情况下使用它。

    var dictionary = new Dictionary<string, string>();
    

    它也用于匿名类型(但编译器仍然必须知道匿名类型的签名)。

    var fred = new { Age = 23, Name = "Fred" };
    

    该方法常用于LINQ queries的select子句中。

    【讨论】:

      【解决方案4】:

      只是一个“抽象”或“语法糖”,无需先指定类型即可编写代码(这不是你的第一个案例

      第二种情况:LINQ 查询,如果你愿意,输入一些未知的、动态的、不具体的。

      可能是:

      var results = from item in someList
                    where item != 3
                    select item; //item a class instance
      

      可能是

       var results = from item in someList
                    where item != 3
                    select item.ItemName; //string property of that class
      

      可能是

       var results = from item in someList
                where item != 3
                select new {item.ItemName, item.ID}; //unknown type dynamically generated, that conains the string and integer, like result
      

      【讨论】:

        【解决方案5】:

        据我所知var 仍然是强类型。编译器计算出正确的类型应该是什么。事实上它没有真正的意义。

        减少操作次数只是一个技巧。例如,当您更改一个类中的类型时,这可能会导致一连串的修改。但它只是将工作从程序员迁移到编译器的一种方式。

        例如,您的 Linq 查询将生成 IEnumerable&lt;TA&gt; 类型。当您更改某些类时,结果将是IEnumerable&lt;TB&gt;,则无需更改这部分代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-01
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          相关资源
          最近更新 更多