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

时间:2013-01-25 15:48:19

标签: c#

如果我有课

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

和我这样的initalise

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

theNum将为零。

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

3 个答案:

答案 0 :(得分:3)

只要theNum是一个字段,就无法判断它是否未被初始化或是否已显式初始化为其默认值(在本例中为0,但如果您有public int theNum = 42)。

如果theNum是一个属性,那么您可以在属性设置器中设置一个标志,允许您确定是否调用了setter,无论您将属性设置为什么值。例如:

class widget {
    private int theNum;
    private bool theNumWasSet;
    public string theName;

    public int TheNum
    {
        get { return theNum; }
        set { theNumWasSet = true; theNum = value; }
    }
}

答案 1 :(得分:3)

一种选择是将theNum更改为int?而不是......然后默认值为空值,与0不同。

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

答案 2 :(得分:0)

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