【问题标题】:When should I use "var" instead of "object"? [closed]我什么时候应该使用“var”而不是“object”? [关闭]
【发布时间】:2011-09-11 00:38:36
【问题描述】:

我想知道你什么时候应该使用var

C# 中的几乎所有东西,除了可能的基元和一些更奇怪的情况,都派生自 Object。

那么使用实际类型不是更好的做法吗?或者至少object

(我已经编程了一段时间,我的严格观点是var是邪恶的)

【问题讨论】:

标签: c# syntax var


【解决方案1】:

我认为,您将vardynamic 混为一谈。使用var完全相同* 就像您写出整个类型名称一样,编译器会将它们呈现为相同的代码。 Eric Lippert 的博客提供了一些关于 var 关键字的作用以及何时使用它的极好的信息。

来自 Eric Lippert 的文章 Uses and misuses of implicit typing:

总结一下,我的建议是:

  • 必要时使用 var;当您使用匿名类型时。
  • 当声明的类型从 初始化器,特别是如果它是 对象创建。这消除了 冗余。
  • 如果代码强调语义“业务”,请考虑使用 var 变量的目的”和淡化 其“机械”细节 存储。
  • 如果代码正确需要这样做,请使用显式类型 理解和维护。
  • 无论您是否使用“var”,都应使用描述性变量名称。 变量名应该代表 变量的语义,而不是细节 其储存; “decimalRate”不好; “interestRate”很好。

*有些人可能会对我的“完全一样”的说法提出异议。对于匿名类型而言,严格来说并非如此,但那是因为您无法合法地写出类型名称。

【讨论】:

【解决方案2】:

你误会了:var 不是类型。 var 指示编译器根据变量的初始化对变量使用 正确 类型。

例子:

var s = "hello";         // s is of type string
var i = 42;              // i is of type int
var x = new [] { 43.3 }; // x is of type double[]
var y = new Foo();       // y is of type Foo

在使用 var 时,您的变量仍然是强类型的。

因此,var 不是“邪恶的”。相反,它非常方便,正如我所说的elsewhere,我广泛使用它。 C# 背后的主要人物之一 Eric Lippert 也写过 in great detail 关于 var 是否是不好的做法。简而言之,“不”。

【讨论】:

  • 对所有事情都使用var 是不好的做法吗?为什么要使用var 而不是显式类型转换?
  • @Tom 我们对此有多个线程。用法很有争议,但我并不真正理解这个问题。我几乎在任何地方都使用它,除非(很少!)可读性会受到影响。
  • @Tom:您会明确指定类型,这样可以使代码更清晰。此外,在极少数情况下,编译器无法推断类型,因此您必须指定它。
  • 我知道,我的意思是“在声明变量类型时”,这不会被认为是不好的做法吗?
  • @Yochai:那就这样写吧。在这种情况下,如果您指定类型会更清楚。但是当人们开始使用“坏习惯”这个词时,我会感到不安。这意味着做事只有“一种正确的方法”,而且很少有。
【解决方案3】:

var 不是类型。 var 对编译器说“我不确定/不能在此处输入正确的类型名称,请根据此语句的上下文为我推断类型”。

Object 将对象转换为类型Object。因此,您会丢失任何类型信息,因此无法再调用在层次结构中低于Object 的级别定义的特定方法、访问属性等。

【讨论】:

    【解决方案4】:

    varobject 是两个完全不同的东西。

    使用var,编译器会为您推断类型。 object 是一个对象,由于 C# 是一种强类型语言,因此您会丢失有关该实例的任何信息。

    请参阅 C# 规范中的第 26.1 节:

    在隐式类型的局部变量声明中,被声明的局部变量的类型是从 用于初始化变量的表达式。当局部变量声明指定 var 作为类型并且没有 名为 var 的类型在作用域内,声明是隐式类型的局部变量声明。

    【讨论】:

      【解决方案5】:

      您的“严格的观点”有点误导...var 确实使用了实际类型。编译器分析右侧表达式的返回类型并将其用作赋值的类型。

      【讨论】:

      • 我从不怀疑编译器,我只是在徘徊,如果它是一个好的编程习惯
      • 我会说这只是一个真正的好习惯,如果基本上理解类型,但真的很长时间才能输入。 (例如,它确实有助于使用 LINQ to Objects。)
      【解决方案6】:

      使用object 您会丢失所有静态类型信息(当用于值类型时,它甚至会导致装箱)。所以使用object 和使用var 有很大的不同。

      var 另一方面等同于使用实际(静态)类型。因此,当说明实际类型不可能或不方便时,您可以使用它。

      • 需要var 的一种情况是使用匿名类型时。它们没有名字(nitpick:只有编译器生成的你不知道的名字),所以你不能明确地命名类型。

      • 使用var 很方便的一种情况是,当您的类型名很长时。使用嵌套泛型时有时会发生这种情况。

      • foreach 循环中,您可以避免不安全的隐式转换。

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 2021-07-13
        • 1970-01-01
        相关资源
        最近更新 更多