我想知道在声明变量时内部究竟发生了什么,如下所示:
string tr;
string tr = null;
在调试时,我注意到两个值都只显示为null。但是,如果在未初始化ref tr
的情况下使用null
,则会产生错误,而第二行则不会。
请帮我深入了解
答案 0 :(得分:9)
您的第一个声明只是声明,您的第二个声明是声明+初始化。
string tr; // Just Declaration
string tr=null; //Declaration + Initialization.
如果您尝试仅使用tr
声明,则可能会出现编译时错误。 (第一种情况)例如:
string tr; // Just Declaration
if (tr == "") //Use of unassigned local variable
{
}
将为ref
关键字生成相同的错误,这需要为字段明确分配(声明+初始化)。但是,使用out
关键字,您可以只使用声明,但该方法将负责确保将某个值分配给out
参数。
答案 1 :(得分:6)
在调试时,我注意到两个值都显示为null 仅
这是正确的,因为string
是reference type,所有引用类型的默认值都是null
。
但是C#编译器不允许使用未初始化的变量。
你的第一个例子只是一个变量声明。但是你的第二个是变量初始化。
这就是为什么如果你写;
string tr;
Console.WriteLine(tr);
你得到编译器错误,如;
使用未分配的局部变量'tr'
必须初始化传递给ref参数的参数 在通过之前。
虽然传递为out
arguments的变量不需要在传递之前进行初始化。
答案 2 :(得分:4)
compliler要求您明确地将null
(或任何其他)值设置为变量。它不希望程序中出现任何误解和运行时错误,因此它会在使用之前轻轻推断出您可能没有初始化变量。
异常是使用带有out
参数的方法(它本身保证初始化)作为未初始化的变量。