我正在验证一些属性,我需要知道其他层是否设置了长整数值。
例如,这个类::
public class Person
{
public int Age {get;set;}
}
当我设置人的新实例时,年龄获取值0.但我必须验证是否设置了年龄 ,因为年龄可以为零(当然不在此上下文中)。
我想到的一个解决方案是将int用作可以为空的整数( public int?Age ),并在 Person 的构造函数中将Age设置为空。
但是我试图避免它,因为我必须更改太多的类只是为了检查 Age.HasValue 并将其用作 Age.Value 。
有什么建议吗?
答案 0 :(得分:20)
Int默认初始化为0;假设您不想使用对您来说完美的int?
。你可以检查一下,或者你可以有一个标志和一个支持字段:
private int _age;
public int Age
{
get { return _age; }
set { _age = value; _hasAge = true; }
}
public bool HasAge { get { return _hasAge; } }
如上所述,您可以将其初始化为无效状态:
private int _age = -1;
public int Age
{
get { return _age; }
set { _age = value; _hasAge = true; }
}
public bool HasAge { get { return _age != -1; } }
或者只是分解并使用int?
public int? Age { get; set; }
public bool HasAge { get { return Age.HasValue; } }
为了与您的代码向后兼容,您可以将其从int?
退回而不会泄露它:
private int? _age;
public int Age
{
get { return _age.GetValueOrDefault(-1); }
set { _age = value; }
}
public bool HasAge { get { return _age.HasValue; } }
答案 1 :(得分:6)
显式设置为默认值的字段(或自动实现的属性)与从未设置的字段之间存在 no 差异。
Nullable<int>
绝对是这里的方法 - 但您需要考虑使用最干净的API。
例如,您可能需要:
public class Person
{
private int? age;
public int Age
{
// Will throw if age hasn't been set
get { return age.Value; }
// Implicit conversion from int to int?
set { age = value; }
}
public bool HasAge { get { return age.HasValue; } }
}
这将允许您直接在假设已设置的地方阅读Age
- 但在他们想要小心时对其进行测试。
答案 2 :(得分:1)
无论您使用何种模式,您都必须在获得值之前进行“设置”查询,因此......
使用您的get / set属性使用的可为空的字段int? age
,并查询IsAgeSet
属性:
public class Person
{
private int? age;
public int Age {
get {return age.Value;} // will fail if called and age is null, but that's your problem......
set {age = value;}
}
public bool IsAgeSet {
get {return age.HasValue;}
}
}