假设您有一个像这样的私有变量
<%
并且您有一个属性可以提供对此变量的外部访问:
private int _x;
更好地放置“验证”逻辑(值非负,在界限内等) 在吸气部分或设定部分?看起来两者都可以接受,但是有一个首选方案吗?
答案 0 :(得分:3)
首选setter是出于以下原因:最好在输入垃圾值时抛出异常或向用户显示消息,而不是允许垃圾值,并使您的类受到内部错误数据的影响。< / p>
您会注意到MSDN Example使用setter进行输入验证。
答案 1 :(得分:3)
您希望代码尽快失败,这是您尝试设置无效值的时候。
当你在setter中失败时,用户立即知道问题并且可以修复它。如果你等到他们试图检索这个值,你就等了太晚了,用户可能不知道出了什么问题,或者在哪里。
如果在代码的其他地方使用了无效值,那么您将在整个应用程序中传播错误数据,使事情变得更糟,甚至不太清楚用户出了什么问题。
答案 2 :(得分:3)
验证逻辑应位于设置器中,以防止无效数据甚至到达_x
。这样,您的班级就会有一个有用的不变:_x
将始终包含有效值。
执行验证的惯用方法是在使用代码尝试将无效值分配给X
时抛出ArgumentException or any of its subclasses。
答案 3 :(得分:2)
应首先调用验证。如果要使用此方法,则应在set
子句中实现逻辑。
如果你想创建漂亮的干净代码,你应该考虑它的专用方法,例如:
public class Test
{
public int X { get; private set; }
public void SetX(int value)
{
//... your logic, throw exception if validation failed
X = value;
}
}
你的班级应该保持你的对象处于有效状态。