【问题标题】:What are the benefits of implicit typing in C# 3.0 >+C# 3.0 中隐式类型的好处是什么>+
【发布时间】:2009-07-27 23:09:36
【问题描述】:

我能看到的唯一优势:

var s = new ClassA();

结束

ClassA s = new ClassA();

是不是以后如果你决定要ClassB,你只需要更改声明的RHS。

我想如果你正在枚举一个集合,你也可以只是'var',然后再找出类型。

是吗??还有其他一些我虚弱的头脑看不到的巨大好处吗?

【问题讨论】:

  • 当我说“我想如果你正在枚举一个集合,你也可以只使用 'var',然后再找出类型。”我知道它已经在运行时输入了......我的意思是在你的逻辑中。
  • Use of var keyword in C#的可能重复

标签: c# .net implicit-typing


【解决方案1】:

它主要是语法糖。这真的是你的偏好。除非使用匿名类型,否则需要使用 var。不过,我更喜欢隐式类型,但它确实在 LINQ 上大放异彩。

我发现两次输入一个类型是多余的。

List<string> Foo = new List<string>();

当我可以很容易地输入 var 时,类型很明显。

var Foo = new List<string>();

【讨论】:

  • 它不是纯糖。使用匿名类型时需要它。
  • 正确,但即使是匿名类型也是糖。
  • 这就像说迭代器是糖。当然你可以自己构建,但编译器实际上为你做了很多工作,包括对 Equals、GetHashcode 和 ToString 的重要覆盖。
  • @M4dRefluX:您可以在 C# 中将很多东西称为“糖”,但我认为更合适的术语是轻量级编译时代码生成。当 C# 编译器将 LINQ 查询、迭代器、匿名类型等内容转换为“普通”代码时,简单的句法优美与复杂的代码生成是有区别的。我会称匿名代表为糖,但我会称匿名类型为有用的代码生成,它可以节省我的时间、精力和金钱。
  • @jrista:我同意,它们绝对可以节省时间,就像 var 关键字一样。我认为我们有不同的定义。对我来说,语法糖是一项让我免于输入冗余代码的功能。
【解决方案2】:

var 对于没有名称供您使用的匿名类型很有用。

var point = new {X = 10, Y = 10};

这将创建一个具有属性 X 和 Y 的匿名类型。不过,它主要用于支持 LINQ。假设你有:

class Person
{
    public String Name {get; set;}
    public Int32 Age {get; set;}
    public String Address {get; set;}
    // Many other fields
}

List<Person> people; // Some list of people

现在假设我只想选择那些未满 18 岁的人的姓名和到 18 岁的年龄:

var minors = from person in people where person.Age < 18 select new {Name = person.Name, YearsLeft = 18 - person.Age};

现在minors 包含一些匿名类型的List。我们可以迭代这些人:

foreach (var minor in minors)
{
    Console.WriteLine("{0} is {1} years away from age 18!", minor.Name, minor.YearsLeft);
}

否则这一切都不可能;我们需要选择整个 Person 对象,然后在循环中计算 YearsLeft,这不是我们想要的。

【讨论】:

    【解决方案3】:

    当我第一次在这里注册时,我开始了一个极具争议的话题(我选择“邪恶”来描述 var 的一般用途显然是一个糟糕的选择。)不用说,我更欣赏 var比我开始该主题之前所做的更好,并且更好地了解如何有效地使用它:

    The evilness of 'var' in C#?

    使用 var 的一些充分理由:

    • 简洁
    • 减少重复 (DRY)
    • 减少重构工作
    • 支持匿名类型(将其添加到 C# 的关键原因)

    【讨论】:

      【解决方案4】:

      看看这个问题。也许他们会帮助你做出决定。

      Use of var keyword in C#
      https://stackoverflow.com/questions/633474/c-do-you-use-var

      【讨论】:

        【解决方案5】:

        它让我不必重复自己。考虑一下:

        Dictionary<string, List<int>> dict = new Dictionary<string, List<int>>();
        

        我们有一个很长的类型名在同一行重复了两次,绝对没有任何好处。此外,如果您需要重构它,则需要更新类型两次。而这同样具有表现力:

        var dict = new Dictionary<string, List<int>>();
        

        这里dict的类型仍然毫无疑问,但代码更短,我认为它也更容易阅读。

        【讨论】:

          【解决方案6】:

          其实C#中的“var”是用来处理匿名类型的。

          喜欢:

          var t = new {number = 10, name = "test"};
          

          【讨论】:

            【解决方案7】:

            隐式类型的首要原因是支持匿名类型,例如由 LINQ 查询生成的类型。在处理复杂类型的泛型时,它们也可以是一个很大的好处……比如Dictionary&lt;int,List&lt;string&gt;&gt;。这不是太复杂,但想象一下枚举......

            foreach KeyValuePair<int,List<string>> pair in myDictionary
            {
            
            }
            

            通过隐式类型简化。

            【讨论】:

              【解决方案8】:

              虽然引入 var 关键字主要是为了支持匿名类型,但我看到更广泛地使用它的主要论点是为了简洁/更易读的代码,以及更适合您的代码行:

              Dictionary<string, double> data = new Dictionary<string, double>();
              versus
              var data = new Dictionary<string, double>();
              

              虽然对大多数人来说不是一个很好的理由,但作为盲人程序员,我也喜欢 var 关键字,因为我听的是读出的代码,因此这里只有一个音节后的变量名 :-)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-02-02
                • 2016-02-08
                • 2016-11-08
                • 2020-04-20
                • 1970-01-01
                • 2017-06-08
                相关资源
                最近更新 更多