加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么自动初始化未分配的局部变量?

发布时间:2020-12-15 04:07:58 所属栏目:百科 来源:网络整理
导读:似乎没有办法在您的代码中找到未分配的局部变量或检查它们,因为编译器会使用未分配的局部变量错误. 为什么编译器在编译时不对这些变量使用default(T)? 即使对于值类型来说更难做,引用类型在这种情况下很容易被初始化为null,对吗? 这是一些测试代码: publi
似乎没有办法在您的代码中找到未分配的局部变量或检查它们,因为编译器会使用未分配的局部变量错误.

为什么编译器在编译时不对这些变量使用default(T)?

即使对于值类型来说更难做,引用类型在这种情况下很容易被初始化为null,对吗?

这是一些测试代码:

public void Test ( )
{
    int x;
    string s;

    if ( x == 5 )
        Console.WriteLine ( 5 );

    if ( s != null )
        Console.WriteLine ( "s" );
}

它返回:

Use of unassigned local variable 'x'
Use of unassigned local variable 's'

更新:

对于声称这是不允许有充分理由的人,为什么允许在课堂上?

public class C
{
    public int X;
    public string S;

    public void Print ( )
    {
        Console.WriteLine ( X );
        Console.WriteLine ( S );
    }
}

这段代码编译完好.

为什么在类级别上没有,但不是在方法级别?

解决方法

我看到你已经更新了你的问题,所以我会更新我的答案.您的问题有两个部分,一个与局部变量相关,另一个与类实例上的实例变量相关.首先,然而,这不是一个真正的编译器设计决策,而是一个语言设计决策.

Spec第12.3.1 / 12.3.2节

局部变量

我们知道为什么你可以定义一个变量而不给它一个值.一个原因,一个这样的例子:

int x;
// do stuff
x = 5;  // Wow,I can initialize it later!
Console.WriteLine(x);

该标准定义了为什么这是有效的代码.现在,我不在C#设计团队,但是为什么他们不会为你自动初始化代码(除了实际上不希望自动初始化的性能之外)还是很有道理的.

说上面的代码是你的意图,但你忘了初始化x = 5;如果编译器为您自动初始化变量,代码将编译,但它不会像您所期望的那样做.

这是一个微不足道的例子,但这是来自语言设计师的一个非常好的设计决策,因为它会节省许多头痛,试图找出为什么某些东西不能按预期工作.

作为一个附注,我不能想到为什么你想要定义代码没有分配一些东西,或使用默认值(在每种情况下)给我可能是一个错误,我’确定编译器设计者可能已经确定了什么.

类实例变量

班级成员由最初分配的标准定义.事实上,为了公正,在catch,foreach或using语句中声明的局部变量最初是未分配的.所以真的,这是一个标准问题,而不是编译器的问题.

如果我尝试猜测为什么关于类实例的实例变量是这种情况,我会说它与内存在堆上的分配有关,因为这是分配这些类的地方.当一个类在堆上被分配时,它的所有成员必须被初始化并且在堆上被分配.在一个类成员中做一个局部变量不仅可以做到这一点,还需要这样做.他们根本不能被分配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读