C# 用于限制可以为属性设置的值的结构化代码

C# 用于限制可以为属性设置的值的结构化代码,c#,.net,vb.net,C#,.net,Vb.net,对属性可以获得的值进行限制编码的正确(也是最好)方法是什么 例如,假设我有以下简单类: Public Class MyClass Public Property MyDate As Date 现在,假设在运行时设置了MyDate,但不能在一年前获取任何值 在MyDate的setter中抛出一个异常,然后在我的主模块中以Try…Catch的方式对其进行编程,然后在值不正确时提醒用户,或者有更好的方法来实现这一点,这样做正确吗 我确信这是一个愚蠢而简单的问题,但我只想确保我是按照最佳编程实践

对属性可以获得的值进行限制编码的正确(也是最好)方法是什么

例如,假设我有以下简单类:

Public Class MyClass
   Public Property MyDate As Date
现在,假设在运行时设置了
MyDate
,但不能在一年前获取任何值

在MyDate的setter中抛出一个异常,然后在我的主模块中以
Try…Catch
的方式对其进行编程,然后在值不正确时提醒用户,或者有更好的方法来实现这一点,这样做正确吗


我确信这是一个愚蠢而简单的问题,但我只想确保我是按照最佳编程实践来做的。

是的,抛出异常是个好主意。在那种情况下似乎是最好的。在MSDN之后:

参数值在外部时引发的异常 由调用的方法定义的允许值范围


看看这篇文章。它概述了System.ComponentModel.DataAnnotations命名空间中的验证器。它们是支持验证的模型属性


ASP.NET MVC支持使用JS在表单上呈现这些验证,但在其他类型的应用程序中,您可以从模型本身读取属性并强制执行验证

虽然抛出异常是一个有效的选项,但我建议不要这样做。原因是,当程序员设置一个属性时,他/她希望除了所设置的值之外几乎不会发生什么。在这种情况下,我建议使用集合函数而不是属性,或者将值作为构造函数的一部分传递(程序员期望发生这种类型的验证逻辑)。

@ytoledano-我的意思是将异常放在集合函数中-基于我在这里读到的所有内容,看起来这是正确的方法-你同意吗???不,我仍然认为如果你在设置时抛出异常,你应该公开一个集合函数而不是属性。为了澄清这一点,函数应该类似于:void setMyDate(DateTime date){…}原谅我的c#。没有显示设计警告并不保证您有一个好的设计。