int? test;
try
{
test = (int?) Int32.Parse ("7");
} catch {}
if (test == null)
Console.WriteLine("test is null!");
else
Console.WriteLine("test = {0}", test);
我有一些代码可以做一些非常类似于此的东西,同样的想法真的......创建变量,尝试初始化它,然后测试初始化是否成功。
Visual Studios正在给我一个错误,说“使用未分配的局部变量'test'”,这有点烦人,可以通过将第一行设置为:
来轻松修复int? test = null;
但我很好奇这两行之间的区别是什么,因为编译器似乎真的很在乎。据我所知,这两行做同样的事情。
答案 0 :(得分:5)
问题是阻塞。编译器必须假设Int32.Parse代码可以抛出并因此命中你的catch块。如果发生这种情况,Int32.Parse行不会完成,因此测试永远不会赋值。这意味着“if”行试图使用未初始化的值。
您可以通过
解决此问题答案 1 :(得分:1)
你混淆了什么是变量声明和什么是变量初始化
之间的区别int? test;
简单地声明你有一个名为test的变量是一个可以为空的int
但
int? test = null;
声明你有一个名为test的变量,它是一个可以为null的int,其值为null
在VB中没有区别,但在c#中存在差异。这就是编译器抱怨的原因,因为如果你的try块出现问题,你的测试变量就永远不会被初始化。
答案 2 :(得分:1)
这是本地定义的变量(在方法或属性内部而不是直接在类中)发生的错误。虽然事实仍然是编译器不需要生成此错误才能工作,但它 它专门用于帮助您识别潜在的意外结果总是分配你的变量。 (如果我错了,有人会纠正我,但至少某些以前版本的C#编译器在某些/所有情况下都没有检查未分配的变量。)
等效(而不是在声明中指定test = null
),您可以通过在catch块中配置test = null
来消除错误,因为这意味着无论代码采用何种路径,变量{{ 1}}被分配。但是,我认为您所声明的解决方案(在声明中指定为null)是正确的 - 您会经常在C#代码中看到它很多(通过try-catch语句,if语句或其他任何内容) ) - 说实话,这只会帮助你了解什么以及何时分配你的变量,即使它看起来像是一个轻微的烦恼。
答案 3 :(得分:1)
你可以避免(int?)强制转换,为“= null”字符串保存7个字节:)
test = Int32.Parse ("7");
答案 4 :(得分:0)
他们做同样的事情,你的是正确的,但是变量需要显式赋值null来摆脱'未分配的值'错误,如果你想要null被认为是一个故意的'not set'变量不会抛出警告。除此之外,Jaredpar的回答恰到好处。
答案 5 :(得分:0)
我相信这种风格更清晰:
try
{
int test = Int32.Parse("7");
Console.WriteLine("Success!");
// add return statement for successful execution here, if any
}
catch
{
Console.WriteLine("Disaster!");
// other return statement here, if any
}
至于编译器错误:在读取之前,必须在代码路径上显式初始化任何本地字段。不初始化本地字段是一个常见的错误,这就是它在C#中出错的原因。 C / C ++只会对此发出警告,如果它没有初始化并且该值反映了调用堆栈中已有的字节,它可以产生* funny *结果。
我只能推测这一点,但它可能是显式初始化本地字段的一个性能方面,与类字段相反:当一个对象被实例化时,运行时初始化对象内存流一次的成本更低,但是,在每次方法调用中多次初始化本地字段是多余的。