【问题标题】:How a variable declared as var can store any data type in c# [duplicate]声明为 var 的变量如何在 C# 中存储任何数据类型 [重复]
【发布时间】:2019-07-11 21:21:10
【问题描述】:

我正在研究我的项目的代码,我是通过“var”关键字来的。我已经知道 var 关键字可以存储任何数据类型。我想了解这是如何发生的。而且我们已经有了 object 关键字来执行此操作。那为什么我们也有 var。我们可以使用 object 关键字来实现为什么要使用 var 关键字。

【问题讨论】:

  • 请阅读问题。我想了解 var 的工作原理。我不想知道 object 和 var 之间的区别。
  • @Amrendra 下次您发布问题时,请花点时间想出一个有用的标题,而不是实际问题的某些内容。
  • @Amrendra 你读过另一个问题(和答案)吗?它与您提出的问题有什么不同?答案没有回答您问题的哪一部分?
  • 所发生的是所谓的类型推断。您可以将 var 视为一个占位符,其中类型由编译器/解释器实际填充,并且该类型是赋值右侧操作数的结果类型。
  • @Luaan 我从下面的答案和“C# 中的 var 是什么意思”中得到了我的答案。如果可能的话,请删除这个问题。

标签: c#


【解决方案1】:

var 不是一个类型——它是一个快捷方式。实际变量的类型在编译时确定。比较:

var number = 42;
number = "42"; // Compilation error! You can't assign a string value to an integer variable

object number = 42;
number = "42"; // No problem - someNumber used to be an instance of the type (boxed) Int32, 
               // and now is of type string. The type of the variable is still just object.

在第一种情况下,变量声明相当于说int number = 42;。类型是根据正确值的类型确定的,在这种情况下,是整数文字。当您尝试以某种方式(例如number + 10)使用该变量时,该变量的行为与任何其他整数变量一样。

在第二种情况下,变量的类型是object。它可以随时存储 C# 中可用的任何值。即使变量包含一个整数类型的值,它仍然表现为一个普通对象(例如,number + 10 是一个编译时错误,因为在objectint 之间没有定义+ 运算符)。

【讨论】:

    【解决方案2】:

    var 实际上不能,正如你提到的,存储任何对象。最初您可以分配任何类型,但以后不能更改为另一种类型。

    var 更适合“懒惰”开发人员,他们不想明确说明创建的对象将是哪种类型,而是希望让 IDE/编译器通过查看任何内容来查看 var 将是哪种类型存储在其中。 (好吧,根据 cmets,不一定总是懒惰。但为了争论,我称之为懒惰。)

    在这个例子中: var foo = "bar";

    IDE 将简单地看到我们要将字符串放入 bar。所以它会知道var 将是string

    您将无法稍后在同一块中执行foo = 12;,因为 foo 是一个字符串。

    在 Visual Studio 中,您实际上可以 ctrl+。在 var 关键字上,并请求 Visual Studio 将 var 关键字更改为 string

    这隐含地意味着你不能在没有直接分配任何东西的情况下创建一个 var,因为 IDE 将无法推断类型,例如只有 var foo;

    【讨论】:

    • 懒惰?几乎不。它专为无法在 C# 代码文本中表示的类型(例如匿名类型)而设计。有很多强类型语言不希望您在分配本地类型时费力地输入它。输入System.String foo = "bar"; 是否优于string foo = "bar";?后者只是“懒惰”吗? :) 另外,确定类型的不是 IDE,而是编译器。
    • "var 仅适用于不想明确说明创建对象的类型的懒惰开发人员" 这完全是错误的。 var 引入了匿名类型的概念 - 所以你可以这样做 var x = new {A = 1, B = 2};。此外,作为副作用,它可以通过消除重复冗长乏味的类型名称的需要来帮助使代码更具可读性 (var x = new Dictionary<int, List<Dictionary<string, Namespace.Type>>>();)
    • @ZoharPeled:我认为您提到的“副作用”实际上是作为开发人员使用它的主要原因之一。然后,当类型推断存在时,您还有其他用途,编译器和库作者等会从中受益。但作为“常规 joe”长期使用的类型,或者例如在 C++ 迭代器中具有已经很长且复杂的签名或 lambda 和/或函数指针的对象,它很棒。使用它,因为它比写 *std::string" 在我的书中不是一个足够好的理由:)
    • 我会将惰性放在引号中,因为var 有时确实是创建变量的唯一方法,就像上述匿名类型一样。但老实说,在超过 90% 的使用中,人们只是使用 var 来避免对变量的类型进行硬编码,即使他们可以这样做。
    • 有时最好对类型进行硬编码,有时相反更好。最后,这是一种风格偏好。至于懒惰,如果我们不懒惰,为什么我们一开始会有软件呢?懒惰是塑造地球上所有生命以及人类进步的因素。只是不要混淆“现在节省一点时间,以后付出十倍的代价”和“现在投入一点时间,以后节省很多时间”。节俭是一种美德。除非有写出来的意义,否则为什么要写出来? :)
    猜你喜欢
    • 2020-03-30
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2019-11-24
    • 2011-10-28
    • 2022-07-25
    相关资源
    最近更新 更多