我在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或仅将其设置为最小(或最大)值,但这取决于您的流程要求.
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)
有几点需要注意:
如果不符合要求,您将需要将逻辑放在setter中并抛出异常.但是,您还需要创建一个IsValidAge静态方法,以便创建Person的类可以检查年龄值,而不仅仅是看它是否抛出异常.或者,您可以使用MinAge和MaxAge属性,因此调用代码可以检查它们将要设置的年龄是否介于它之间.
不要创建自定义异常类型,使用ArgumentOutOfRangeException或类似的东西.