C# - 检查是否设置了整数属性

本文关键字:整数 属性 设置 是否 检查 | 更新日期: 2023-09-27 17:55:46

我正在验证一些属性,我需要知道长整型值还是整数值是由其他层设置的。

例如,此类::

public class Person 
{
    public int Age {get;set;}
}

当我设置人员的新实例时,年龄得到值 0。但我必须验证是否设置了年龄,因为年龄可以为零(当然不是在这种情况下)。

我想到的一个解决方案是使用 int 作为可为空的整数(public int?年龄),并在 Person 的构造函数中将年龄设置为 null。

但我试图避免它,因为我必须更改太多类才能检查 Age.HasValue 并将其用作 Age.Value

有什么建议吗?

C# - 检查是否设置了整数属性

默认情况下,

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; } }

显式设置为其默认值的字段(或自动实现的属性)与从未设置的字段(或自动实现的属性)之间没有区别。

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 - 但在他们想要小心时对其进行测试。

无论您使用哪种模式,都必须在获取值之前进行"已设置"查询,因此...

使用 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;}
    }
}