【问题标题】:C# variable initializations vs assignmentC# 变量初始化与赋值
【发布时间】:2010-09-23 15:00:28
【问题描述】:

在一本书中我发现以下内容(翻译):

初始化是指在声明时给变量赋值。 int X=5 称为初始化命令。

编辑:它只是说只有在声明时赋值时才使用术语初始化。如果你稍后再做,它只是分配(根据它 - 我不这么认为,这就是我问的原因)。是真是假?

嗯,我一直在考虑(根据网上其他人的说法,也是)关于初始化的第一次赋值给变量。我认为int X=5 只是作为声明一部分的赋值。

我试图在 MSDN 上搜索,但没有成功。感谢您提供任何信息。

【问题讨论】:

  • 不清楚您在说什么显着差异。你能详细说明一下吗?
  • 你能澄清你在这里问什么吗?事实上,您并没有在您的帖子中提出任何问题。

标签: c# .net variables syntax terminology


【解决方案1】:

如果您要问的只是术语(从您的问题中并不清楚),那么变量的“初始化”实际上是第一次为其分配值。这个术语来自于你给变量它的“初始”值。

这应该(显然)在第一次使用之前发生。

int x=5;

是一个声明和一个初始化,实际上只是方便的简写

int x;
x=5;

【讨论】:

  • 是的,我想是的。在这方面,如果这本书说初始化是仅在声明时使用的术语是错误的。
【解决方案2】:

通常,变量的初始化是声明后的第一个赋值,因为变量不会自动初始化。随后的分配只是分配。

void foo() {
    int i;//not initialized.
}

fields 除外,它们是在类或结构中声明的变量。在为该对象实例调用构造函数之前,它们被初始化为它们的default values。因此,即使您(首先)为构造函数中的字段分配某些内容并且该字段在声明时未初始化,严格来说,它是分配,而不是初始化。无需赘述,我想许多程序员确实将构造函数中字段的第一次赋值视为初始化,并且可能会在彼此的对话中使用它。可能这种用法/习惯源于使用了像 C/C++ 这样的非托管语言,其中变量在首次声明时包含乱码,因此他们必须用非垃圾值(初始化)填充它。

class A {
    int x;//not initialized
    int y = 1;//initialized here
    A() {
        x = 1;//strictly speaking, not initialization, just assignment.
        y = 2;//was obviously initialized above
    }
}

对于不编写编译器或语言的程序员来说,能够与其他程序员有效沟通比了解单词初始化的确切术语更重要。因此,请继续以您周围每个人都理解的含义使用它。你解释一下确切的意思不会错(但我可能不会因为害怕暴露我的迂腐倾向)。

我个人会避免使用术语“初始化命令”来表示变量的书。

【讨论】:

    【解决方案3】:

    一般来说,如果第一次分配变量,无论是由程序显式分配还是由编译器/运行时隐式分配,都会进行初始化。然而,初始化机制对于理解尤其是在使用类时很重要。考虑单步执行下面的简单示例(在某处创建“Bar”的实例)以查看编译器如何进行初始化过程。您会注意到,这些字段是通过初始化声明的,并且在构造函数有机会设置它们之前都已“初始化”。

    public class barBaseBase
    {
        protected int x = 5;
        public barBaseBase()
        {
            x = 4;
        }
    }
    
    public class barBase : barBaseBase
    {
        protected int y = 4;
        public barBase()
        {
            x = 3;
            y = 2;
        }
    }
    
    public class Bar : barBase
    {
        protected int z = 3;
        public Bar()
        {
            x = 2;
            y = 1;
            z = 0;
        }
    }
    

    【讨论】:

      【解决方案4】:

      请注意,初始化字段会导致 C# 编译器发出初始化 IL 指令为每个构造函数。因此,如果您有多个构造函数,您将重复初始化 IL - 即不必要的代码膨胀。

      最好在默认构造函数中初始化变量并让其他构造函数调用它。

      【讨论】:

        猜你喜欢
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 2021-03-19
        • 1970-01-01
        • 2011-03-14
        相关资源
        最近更新 更多