C#属性:在getter或setter中验证?

时间:2016-12-23 16:23:22

标签: c# properties

假设您有一个像这样的私有变量

<%

并且您有一个属性可以提供对此变量的外部访问:

private int _x;

更好地放置“验证”逻辑(值非负,在界限内等) 在吸气部分或设定部分?看起来两者都可以接受,但是有一个首选方案吗?

4 个答案:

答案 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;
    }
}

你的班级应该保持你的对象处于有效状态。