如果我有课
class widget {
public int theNum;
public string theName;
}
和我这样的initalise
widget wgt = new widget { thename="tom" };
theNum
将为零。
我有没有办法检查实例wgt以确定成员theNum是否默认,即从对象初始化中排除?
答案 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。