对象初始化可以确定成员是否为默认值

本文关键字:成员 是否 默认值 初始化 对象 | 更新日期: 2023-09-27 17:55:55

如果我有一个类

class widget {
    public int theNum;
    public string theName;
}

我像这样发起

widget wgt = new widget { thename="tom" };

theNum将为零。

有没有办法让我检查实例 wgt 以确定成员 theNum 是默认的,即从对象初始化中排除?

对象初始化可以确定成员是否为默认值

只要

theNum是一个字段,你就无法判断它是否未初始化或是否显式初始化为其默认值(在本例中为 0 ,但如果你有 public int theNum = 42,可能会有所不同)。

如果theNum是一个属性,则可以从属性 setter 中设置一个标志,该标志允许您确定是否调用了 setter,而不管您将属性设置为什么值。例如:

class widget {
    private int theNum;
    private bool theNumWasSet;
    public string theName;
    public int TheNum
    {
        get { return theNum; }
        set { theNumWasSet = true; theNum = value; }
    }
}

一种选择是将theNum更改为int?...则默认值将为 null 值,它不同于 0。

请注意,我希望这些是公共属性而不是公共字段 - 在这种情况下,您可以将属性类型设为int,将int?保留为支持字段类型,并通过测试字段值是否为空提供一些其他检查初始化的方法。

而不是int使用int?(这是System.Nullable<int>的简写。 然后,如果没有人将其初始化为有效的整数,它将为空。