关于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#中编译器保证变量必须初始化规则猜想

上一篇:使用windows自带的虚拟网卡搭建无线网络


下一篇:阿里云视觉AI 5天实践训练营-day01-视觉生产技术探索和应用简单介绍