C#属性 - 设置问题

Rya*_*yer 8 c#

我在C#工作,我开始玩房产了.我不知道的一件事是什么是为类属性的set访问器设置逻辑以及如何处理错误的最佳方式/位置.

例如,假设我有这个(基础)课程:

class Person
{
    private int _Age = 18;

    public Person()
    {

    }

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

现在说我对Age属性有一个要求,0 <Age <100.我在哪里为此设置逻辑?

我应该把它放在房产里吗?

public int Age
    {
        get
        {
            return _Age;
        }
        set
        {
           if (value < 0 || value > 99)
               // handle error
           else
               _Age = Convert.ToInt32(value);
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者通过创建Person对象的类?

static void Main(string[] args)
{
   Person him = new Person();
   int NewAge = -10;

   if (NewAge < 0 || NewAge > 100)
      // handle error 
   else
      him.Age = NewAge;
}
Run Code Online (Sandbox Code Playgroud)

现在如果NewAge出现问题(它不符合我的约束条件)怎么办?我应该创建一个自定义异常并抛出它吗?我应该打印一条消息说是否提供有效年龄?

我做了一些谷歌搜索,我找不到任何能完全回答我问题的内容.我需要一本书: - /

Adr*_*ong 23

使用属性setter,就是出于这个原因(向字段添加功能).

如果传入超出范围值,则可以抛出ArgumentOutOfRangeException或仅将其设置为最小(或最大)值,但这取决于您的流程要求.

  • +1表示抛出ArgumentOutOfRangeException而不仅仅是Exception (3认同)

Mat*_*ley 11

我会像这样实现它:

public int Age
{
    get
    {
        return _Age;
    }
    set
    {
       if (IsValidAge(value))
           _Age = value;
       else
           throw new ArgumentOutOfRangeException("value", string.Format("value should be between {0} and {1} inclusive.", MinAge, MaxAge));
    }
}

private bool IsValidAge(int age)
{
    return (age >= MinAge && age <= MaxAge);
}
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • 不要改变它们的值而不是抛出异常,这是意外的行为.
  • .NET框架在setter中引发了Argument*异常,所以我认为遵循这种做法是个好主意.在这种情况下,ArgumentOutOfRangeException是完美的,IMO.
  • 在引用异常消息和xml文档中的参数时,标准是调用参数"value",而不是属性的名称.
  • 我建议将MinAge和MaxAge作为你班级中的私有功能,不要陷入硬编码错误信息的陷阱,其中包含范围边界,没有什么比被告知"5无效,请输入1到10之间的数字更糟糕的事情"当有人稍后更改规范但忘记更新字符串时.


Max*_*ing 6

如果不符合要求,您将需要将逻辑放在setter中并抛出异常.但是,您还需要创建一个IsValidAge静态方法,以便创建Person的类可以检查年龄值,而不仅仅是看它是否抛出异常.或者,您可以使用MinAge和MaxAge属性,因此调用代码可以检查它们将要设置的年龄是否介于它之间.

不要创建自定义异常类型,使用ArgumentOutOfRangeException或类似的东西.