Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C初始化混乱!_C#_Syntax_Null - Fatal编程技术网

C# C初始化混乱!

C# C初始化混乱!,c#,syntax,null,C#,Syntax,Null,我有一些代码做一些非常类似的事情,同样的想法真的。。。创建一个变量,尝试初始化它,然后测试初始化是否成功 Visual Studio给了我一个错误,称使用未分配的局部变量“test”,这有点烦人,通过将第一行设置为: int? test; try { test = (int?) Int32.Parse ("7"); } catch {} if (test == null) Console.WriteLine("test is null!"); else Conso

我有一些代码做一些非常类似的事情,同样的想法真的。。。创建一个变量,尝试初始化它,然后测试初始化是否成功

Visual Studio给了我一个错误,称使用未分配的局部变量“test”,这有点烦人,通过将第一行设置为:

int?  test;
try
{
    test = (int?) Int32.Parse ("7");
} catch {}

if (test == null)
     Console.WriteLine("test is null!");
else
     Console.WriteLine("test = {0}", test);

但我很好奇这两行之间的区别,因为编译器似乎真的很在意。据我所知,这两条线的作用是一样的。

问题在于挡块。编译器必须假定Int32.Parse代码可以抛出,从而命中catch块。在这种情况下,Int32.Parse行不会完成,因此测试永远不会被赋值。这意味着if行正在尝试使用未初始化的值

你可以通过

在catch块中指定测试值 在方法开始时将其初始化为null
您混淆了什么是变量声明,什么是变量初始化

int?  test = null;
简单地说,您有一个名为test的变量,它是一个可为null的int

但是

声明您有一个名为test的变量,该变量是可为null的int,其值为null


在VB中没有区别,但在c中有区别。这就是编译器抱怨的原因,因为如果您的try块出现故障,那么您的测试变量将永远不会被初始化。

他们做了同样的事情,您的操作是正确的,但是该变量需要显式赋值null以消除“未赋值”错误,如果您希望null被认为是一个故意的“未设置”变量,它不会抛出警告。除此之外,Jaredpar的答案是正确的。

对于方法或属性中的本地定义变量而言,这是一个错误,而不是直接在类中。尽管事实上编译器不需要生成这个错误就可以工作,但它这样做是为了帮助您在不总是分配变量的情况下识别潜在的意外结果。如果我错了,有人会纠正我,但至少在某些/所有情况下,C编译器的一些早期版本没有检查未分配的变量


等价地,您可以通过在catch块中分配test=null来消除错误,而不是在声明中分配test=null,因为这意味着无论代码采用什么路径,都会分配变量test。但是,我认为您在声明中声明的赋值为null的解决方案是正确的-您经常会在C代码中看到它,它通过try-catch语句、if语句或其他任何语句进行分支-老实说,它只帮助您了解赋值变量的内容和时间,即使这看起来像是轻微的刺激。

你可以避免int吗?cast,为=null字符串保存7个字节:

int?  test = null;

我认为这种风格更干净:

test = Int32.Parse ("7");
至于编译器错误:在读取代码路径之前,必须在代码路径上显式初始化任何本地字段。不初始化本地字段是一个常见错误,这就是为什么它在C中是一个错误。C/C++仅对此发出警告,如果它没有初始化,并且该值反映了调用堆栈上已经存在的字节,它可能会产生“有趣”的结果


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

OT,但是FWIW。。。你可能想了解一下,我并没有实际使用这段代码,这只是我偶尔遇到的一个场景。这个答案大部分是错误的,尽管它得出了正确的结论。首先,可空类型是值类型,而不是引用类型。其次,引用类型不需要指定值。在使用局部变量之前,需要为它们指定一个值。第三,无法在编译器中关闭该错误。结论——局部变量在使用前必须明确赋值——是正确的,但结论是通过不正确的推理得出的。@eric lippert:是的,我写这篇文章时显然脑子不正常。我试图区分何时和何时在使用变量之前需要分配变量正确的条件适用于所有局部变量,但不适用于实例/静态变量。不管怎样,我的大部分解释都与主参数有点相切,因此我关于生成错误以帮助您确定问题的可能来源的观点仍然正确。我的观点是,问题与引用类型与值类型完全无关,所以不要提及它。这个问题与局部变量和任何其他类型的变量有关
易变的。在读取所有变量的内容之前,必须明确指定所有变量。但是在C语言中的所有变量中,只有局部变量被认为是初始未赋值的。是的,您的结论是,明确的分配检查功能可以帮助您在分配本地文件之前发现使用本地文件的常见错误,这是正确的。@Meiscooldude:请至少现在重读我的文章,以收集正确的信息-对于最初的一些垃圾,我感到抱歉。另外,如果你现在接受另一个答案,我一点也不会生气——它们现在都是正确的,所以这取决于你。
test = Int32.Parse ("7");
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
}