首页 > 代码库 > 关于C#中编译器保证变量必须初始化规则猜想

关于C#中编译器保证变量必须初始化规则猜想

现在两种情况:

第一种情况:

using System;namespace Wrox{    public class Program    {        static void Main(string[] args)        {            int index;                         if(true)            {                                index = 100;                        }                        Console.WriteLine(index);                        Console.ReadKey();                    }    }}

 

第二种情况:

using System;namespace Wrox{    public class Program    {        static void Main(string[] args)        {            int index;             bool istrue=true;             if(istrue == true)            {                                index = 100;                        }                        Console.WriteLine(index);                        Console.ReadKey();                    }    }}

 

在以上两种情况中,第一种情况正常编译;第二种情况编译失败,提示index变量未初始化。

究其原因个人猜测分析如下:

在第一种情况中,编译器在执行到if语句的时候,由于true是常量,因而在编译阶段即可判别该index初始化的分支一定会走到,所以编译成功。

在第二种情况中,编译器执行到if语句的时候,由于istrue是变量,所以此时编译器还无法获取其值。因此编译器用以判断index是否初始化的操作,是去判断if可能覆盖的所有分支都初始化了index变量。由于此时仅仅只在if一个分支中初始化index,所以此时会编译出错。

为了验证以上推论,可修改代码如下:

using System;namespace Wrox{    public class Program    {        static void Main(string[] args)        {            int index;             const bool istrue=true;             if(istrue == true)            {                                index = 100;                        }                        Console.WriteLine(index);                        Console.ReadKey();                    }    }}

 

以上代码正常编译,故而可佐证上述推论。

关于C#中编译器保证变量必须初始化规则猜想