【问题标题】:What does 'value type that is initialized to all 0's' mean?“初始化为全 0 的值类型”是什么意思?
【发布时间】:2013-07-16 04:39:45
【问题描述】:

我想知道我目前正在阅读的一本关于 C# 的书中的一句话。这句话是:

'初始化为全0'的值类型。

可能我不明白,因为我不是母语人士。

在我对语言的理解中,这是否意味着变量在初始化时具有多个值?这对我来说真的没有意义。你能帮我理解这是什么意思吗?

【问题讨论】:

    标签: c# initialization


    【解决方案1】:

    我认为句子的表述不正确。 我猜作者的意思是,或者应该写,一个值类型在声明时被初始化为其默认值。 如果是整数(值类型),则默认值为 0。

    例如

    public struct Test
    {
       public int a;
       public Decimal b;
       public DateTime c;
    
       public void Output(){
    
          Console.WriteLine ("a: " + a);
          Console.WriteLine ("b: " + b);
          Console.WriteLine ("c: " + c);
    
       }
    }
    
    var t = new Test();
    t.Output();
    

    将显示:

    a: 0
    b: 0
    c: 01/01/0001 0:00:00
    

    【讨论】:

    • 这仅适用于字段,不适用于本地。此外,引用类型也是默认初始化的。
    • 这句话是正确的,因为内存中的基础值(在DateTime 的情况下,自显示为值c 的日期以来的滴答声)将为零。 +1 用于将 DateTime 显示为内存值确实为 0 的示例,即使它不表示我们将解释为“零”的值。
    【解决方案2】:

    考虑这个值类型:

    public struct Point
    {
       public int X;
       public int Y;
    }
    

    这里的“全 0”表示 X = 0 和 Y = 0。

    更新:我刚刚发现这个例子用在MSDN documentation for struct中。他们抛出了一个构造函数。

    【讨论】:

    • 我认为这个回答有些不准确。内存中的零不一定意味着“零”,就像int 变量一样。然而,书中的句子可能指的是记忆中的零。
    【解决方案3】:

    可能是关于值类型的默认值,例如bytedoubleintsbyteshortuintushort、@987654329 @。

    例如当你这样说的时候;

    int i = new int();
    

    i初始化为0.

    查看Default Values Table (C# Reference)

    它也可以在结构类型中使用值类型,例如;

    public struct MyStruct
    {
       public int X;
       public short Y;
       public double Z;
    }
    

    XYZ 的值为0

    【讨论】:

      【解决方案4】:

      最有可能作者的意思是值类型实例中存在的每种类型的 默认 值(每种类型自然可能不同)。

      要做到这一点,你可以这样做:

      MyStruct struc = default(MyStruct);
      

      【讨论】:

        【解决方案5】:

        值类型的变量在内存中占用一定数量的字节。该类型初始化为零的声明意味着所有这些字节在变量初始化时都设置为值0

        正如this question 中所述,这似乎适用于许多(如果不是全部)值类型(即原始数字类型、结构等)。

        【讨论】:

          【解决方案6】:

          值类型是非引用类型,例如结构或整数。通过说它“初始化为全零”,这意味着如果您不将其设置为某个值,它将自动初始化为零值。

          public class Foo
          {
              public int  _foo;
              public int? _bar;
          
              public void Output()
              {
                  Console.WriteLine(this._foo); // Outputs: 0
                  Console.WriteLine(this._bar.HasValue ? "not null" : "null"); // Outputs: null
              }
          }
          

          【讨论】:

          • 别忘了这对于int?(Nullable<T>) 是错误的。我的意思是哪个默认为 null
          • 是的。 Nullables 是引用类型,因为它们封装了值类型。
          • 啊,有趣。有道理。
          • @NickGotch 你的假设是错误的。它实际上是一个结构。其中有一个布尔值 HasValue,将其设置为 null 只会使该布尔值变为 false。它实际上是一个Struct 编译器假装显示为null。
          • 所以 Nullable 默认为零的原因是,如果所有内容都初始化为零,则 HasValue 将默认为 false 并使其充当空值。很高兴知道。
          猜你喜欢
          • 2010-09-10
          • 2020-07-17
          • 2012-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-13
          • 1970-01-01
          相关资源
          最近更新 更多