C# 声明中的差异:“;var x=…”;vs";var x;x=…”的;
我是C#的新手,请帮助我理解以下陈述之间的区别: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(); /
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,这似乎没有人提到过