C# - 检查是不是设置了整数属性
Posted
技术标签:
【中文标题】C# - 检查是不是设置了整数属性【英文标题】:C# - Check if integer property is setC# - 检查是否设置了整数属性 【发布时间】:2011-08-22 15:36:41 【问题描述】:我正在验证一些属性,我需要知道其他层是否设置了长值或整数值。
比如这个类::
public class Person
public int Age get;set;
当我设置 Person 的新实例时,Age 的值为 0。但我必须验证是否设置了 Age ,因为 Age 可以为零(当然不是在这种情况下)。
我想到的一个解决方案是将 int 用作可为空的整数 (public int? Age) 并在 Person 的构造函数中将 Age 设置为空。
但我试图避免它,因为我必须更改太多类来检查是否 Age.HasValue 并将其用作 Age.Value。
有什么建议吗?
【问题讨论】:
您必须更改许多类的事实是一个弱论据,因为任何可能的解决方案都将涉及相当大的变化。 听起来您希望您的值类型具有额外的“可为空”状态。当然,这正是int?
的用途。
【参考方案1】:
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;
【讨论】:
【参考方案2】:明确设置为其默认值的字段(或自动实现的属性)与从未设置的字段(或自动实现的属性)之间没有区别。
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
- 但当他们想要小心时对其进行测试。
【讨论】:
【参考方案3】:无论您使用什么模式,您都必须在获取值之前进行“已设置”查询,所以...
使用您的 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;
【讨论】:
以上是关于C# - 检查是不是设置了整数属性的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中检查 double 是不是为整数的好方法是啥? [复制]