属性访问者/ mutator(getter / setter)是否是强制执行可接受范围的正确位置?

时间:2012-02-06 19:15:38

标签: c# validation properties

在设置端口号的应用中,我想将可分配给端口号的值限制在49152和65535(含)之间。

我编写了一些测试方法,测试超出此范围的任何内容都会导致测试失败。它们确实失败了(正如预期的那样,因为代码还没有考虑到这一点)。

所以我的问题是:将强制无效值的代码放到有效值的最佳位置是什么 - 这里:

public int Port
{
    get
    {
        return port;
    }
    set
    {
        port = value;
    }
}

如:

public int Port
{
  get
  {
      return port;
   }
   set
   {
       if ((value < 49152) || (value > 65535))
       {
          value = 55555;
       }
       port = value;
    }
}

......或其他地方?

3 个答案:

答案 0 :(得分:15)

  

将强制无效值的代码置于有效值的最佳位置是什么?

最好的地方是无处。强制将无效值强制为随机有效值是隐藏调用者中的错误。调用者可以提前知道他们尝试设置的值是否有效,因此如果他们做错了就会崩溃。抛出异常,不要忽略错误并猜测它们的含义。

答案 1 :(得分:12)

你可以在你的setter中放置验证逻辑,但是如果验证失败,你应该让别人知道。

即:

private static int minimumPortNumber = 49152;
private static int maximumPortNumber = 65535;

public int Port
{
  get
  {
      return port;
   }
   set
   {
       if ((value < minimumPortNumber) || (value > maximumPortNumber))
       {
           throw new ArgumentOutOfRangeException("port", string.Format("The port number is out of range. It must be between {0} and {1}", minimumPortNumber, maximumPortNumber));
       }
       port = value;
    }
}

答案 2 :(得分:2)

这是围绕字段使用包装器方法而不是直接暴露它们的最大好处之一。所以我肯定会说,是的。