【问题标题】: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? 的用途。

标签: c# properties


【解决方案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;}
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 2015-10-27
        • 2011-11-03
        相关资源
        最近更新 更多