C# 声明中的差异:“;var x=…”;vs";var x;x=…”的;

C# 声明中的差异:“;var x=…”;vs";var x;x=…”的;,c#,variables,C#,Variables,我是C#的新手,请帮助我理解以下陈述之间的区别: var variable_name = new class_a(); // there is no error and is working fine var variable_name; variable_name = new class_a(); // this line is throwing error 当我把声明改写为 class_a variable_name; variable_name = new class_a(); /

我是C#的新手,请帮助我理解以下陈述之间的区别:

var variable_name = new class_a(); // there is no error and is working fine

var variable_name; 
variable_name = new class_a(); // this line is throwing error
当我把声明改写为

class_a variable_name; 
variable_name = new class_a(); // this is working fine

当您使用
var
时,您没有指定
数据类型
,因此您应该为它分配一些值,以便
var
“变量”成为该
数据类型的变量

仅声明和不分配将没有帮助,并且在
var
的情况下将抛出错误


希望它能消除您的疑虑。

var
根据变量初始化时使用的值自动推断数据类型

var i = 3;    // 3 is an int; thus, i is declared as an int.
在第二个示例中,没有指定值,因此无法进行推断

var i;        // no data type can be inferred

var
用于引入。该类型在编译时已知,并从初始化语句右侧的表达式类型推断出来。以您的例子:

var variable_name = new class_a();
var var_name; // The compiler does not know what type var is. It has not been inferred. Error!

var var_name = new class_a(); // The compiler knows var has been inferred as class_a();
编译器推断出
new class_a()
是一个产生
class_a
类型的对象的表达式。因此
变量\u name
被声明为
类\u a
类型。此代码完全等同于

class_a variable_name = new class_a();

如果省略了初始化的右侧,则编译器无法推断类型。因此出现编译错误。

因为
var
推断类型,并在编译时计算为静态类型声明,例如:

var variable_name = new class_a();
var var_name; // The compiler does not know what type var is. It has not been inferred. Error!

var var_name = new class_a(); // The compiler knows var has been inferred as class_a();
这相当于

class_a var_name = new class_a();

下载、编译代码,使用ILSpy反映代码,并查看
var
声明的情况。

编译器希望在为其分配内存块时了解变量的类型。第三行完成它,然后给它一个值。第一行是可以的,因为它在一行上,编译器知道变量的类型应该是
class\u a
,它将分配一个内存,同时给出
newclass\u a()
对象的值

但是第二个错误是因为它将分配一个没有类型的内存!你不能把任何类型的对象放在特定的内存中

可能有助于你理解这一点。只是为了补充现有的答案。“var”有一个替代选项“dynamic”,它的类型在运行时被动态解析。如果你尝试你的第二行与动态关键字,它将工作良好。然而,动态类型在某种程度上降低了代码的可见性,并且不允许intellisense自动完成。编译时+1,这似乎没有人提到过