C#初始化混乱!

时间:2009-05-07 19:37:44

标签: c# syntax null

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;

但我很好奇这两行之间的区别是什么,因为编译器似乎真的很在乎。据我所知,这两行做同样的事情。

6 个答案:

答案 0 :(得分:5)

问题是阻塞。编译器必须假设Int32.Parse代码可以抛出并因此命中你的catch块。如果发生这种情况,Int32.Parse行不会完成,因此测试永远不会赋值。这意味着“if”行试图使用未初始化的值。

您可以通过

解决此问题
  1. 在catch块中分配测试值
  2. 在方法开始时将其初始化为null

答案 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 *结果。

我只能推测这一点,但它可能是显式初始化本地字段的一个性能方面,与类字段相反:当一个对象被实例化时,运行时初始化对象内存流一次的成本更低,但是,在每次方法调用中多次初始化本地字段是多余的。

相关问题