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

B. *_*non 2 c# validation properties

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

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

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

public int Port
{
    get
    {
        return port;
    }
    set
    {
        port = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

如:

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

...或者别的地方?

Eri*_*ert 15

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

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


ken*_*ken 12

您可以在验证器中放置验证逻辑,但是如果验证失败,您可能应该让某人知道.

即:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,但考虑从setter中抛出异常来指示错误(即,如果setter在无效输入上抛出异常,则可以,但是setter的调用者应该验证输入以防止抛出此类异常).另外需要注意的是,IMO端口应该具有`static readonly` minport/maxport成员."49152"和"65535"让我觉得是神奇的数字. (2认同)