C# 声明为var的变量如何在c中存储任何数据类型#

C# 声明为var的变量如何在c中存储任何数据类型#,c#,C#,我正在研究我的项目的代码,通过“var”关键字,我已经知道var关键字可以存储任何数据类型。我想了解这是如何发生的。我们已经有object关键字来实现这一点。那么为什么我们也有var。我们可以使用object关键字来实现这一点为什么要使用var关键字。var不是一种类型-这是一条捷径。实际变量的类型在编译时确定。比较: var number = 42; number = "42"; // Compilation error! You can't assign a string value to

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

var
不是一种类型-这是一条捷径。实际变量的类型在编译时确定。比较:

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

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


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

var
实际上无法存储任何对象,正如您所提到的。最初可以指定任何类型,但以后不能更改为其他类型

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

在本例中:
var foo=“bar”

IDE将简单地看到,我们将把一个字符串放入bar中。因此它将知道
var
将是
string

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

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


这意味着您不能在不直接为其分配任何内容的情况下创建var,因为IDE将无法推断类型,例如仅在
var foo中

请阅读问题。我想了解var是如何工作的。我不想知道object和var之间的区别。@Amrendra下次发布问题时,请花点时间想出一个有用的标题,而不是实际问题的一些内容。@Amrendra您阅读了其他问题(和答案)了吗?这和你问的问题有什么不同?你的问题的哪一部分没有被答案所回答?所发生的是所谓的类型推断。您可以将var视为一个占位符,其中一个类型实际上由编译器/解释器填充,该类型是赋值的右操作数的结果类型。@Luaan我从下面的答案以及“var在c#中的含义是什么”中得到了答案。如果可以,请删除该问题。Lazy?几乎不它是为无法在C代码文本中表示的类型而设计的(例如匿名类型)。有很多强类型语言不希望您在分配本地类型时费力地键入它。正在键入
System.String foo=“bar”优于
字符串foo=“bar”?后者只是“懒惰”?:)此外,决定类型的不是IDE,而是编译器。“var只是针对不想明确说明所创建对象的类型的懒惰开发人员”,这完全是错误的
var
引入了匿名类型的概念,因此您可以执行
VarX=new{A=1,B=2}。另外,作为一个副作用,它可以通过消除重复冗长乏味的类型名(
var x=new Dictionary();
)@ZoharPeled帮助提高代码的可读性:我认为您提到的“副作用”实际上是将其用作开发人员的主要原因之一。当存在类型推断时,编译器和库作者等还可以从其他用法中获益。但是,作为一个“正则乔”长的挥舞类型,或者在具有复杂的签名或lambdas和/或函数指针的对象的C++迭代器中,它是很棒的。使用它,因为它比写*std::string短在我的书中,这不是一个很好的理由:)我将在引号中加上lazy,因为
var
有时确实是创建变量的唯一方法,就像前面提到的匿名类型一样。但老实说,在超过90%的使用中,人们只是使用
var
来避免硬编码变量的类型,即使他们可以这样做。有时硬编码类型更好,有时相反更好。最后,这是一种风格偏好。至于懒惰,如果我们不懒惰,为什么我们会有软件呢?懒惰塑造了地球上所有的生命,也塑造了人类的进步。只是不要混淆“现在节省一点时间,以后付出十倍的代价”和“现在投入一点时间,以后节省很多时间”。节俭是一种美德。除非写出来有意义,为什么要写出来呢?:)
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.