声明的区别:"var x = .." 和 "var x; x = .."

4

我是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”关键字是在运行时还是编译时确定的?这个问题的答案可能会帮助你理解。 - Liam
只是为了补充现有的答案。 "var" 有一个替代品 "dynamic",它的类型在运行时动态解析。如果您尝试使用 dynamic 关键字进行第二行操作,它将正常工作。但是 dynamic 类型会在一定程度上降低代码的可见性,并且不允许智能感知自动完成。 - Dmitry
5个回答

7

var用于引入隐式类型局部变量。类型在编译时已知,并且是从初始化语句右侧表达式的类型推断出来的。使用您的示例:

var variable_name = new class_a();

编译器推断new class_a()是一个产生类型为class_a的对象的表达式。因此,variable_name被声明为class_a类型。这段代码与以下代码完全等效:
class_a variable_name = new class_a();

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


5

var 可以根据变量初始化时的值自动推断数据类型。

var i = 3;    // 3 is an int; thus, i is declared as an int.

在您的第二个例子中,没有指定值,因此无法进行推断。
var i;        // no data type can be inferred

4
当你使用var时,你不需要指定datatype,因此你应该为它分配一些值,这样var 'variable'就变成了那个datatype
仅声明而不进行分配是没有用的,在var的情况下会抛出错误。
希望能够解决你的疑惑。

2

由于var可以推断类型并在编译时被评估为静态类型声明,例如:

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,编译您的代码,并使用 ILSpy 进行反射,查看您的 var 声明会发生什么。


+1 是关于编译时的,似乎没有其他人提到过。 - Liam

0

编译器在为变量分配内存块时需要知道其类型。第三行代码完成了这个任务并给变量赋值。第一行代码没问题,因为它只有一行,编译器知道变量应该是class_a类型,并在分配内存的同时赋值为new class_a()对象!
但第二行代码会出错,因为它将分配一个没有类型的内存块!你不能把任何类型的对象放入这个特定的内存块中!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接