我刚刚阅读了实用程序员和契约设计章节。我想到,当我们在一个公共库中创建一个函数时,指定参数的属性将是一件有用的事情。
我想知道是否有人遇到过这样的想法,我不相信它存在于C#中我是怎么想的,这就是这样的;
public String SendEmail(String ToAddress [RegExMatch(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b")], FromAddress, Body)
为了便于阅读,将它放在我认为的函数声明之上会更有意义。
我无法想象这会是一个坏主意,因为该函数可以自动为无效参数抛出异常。但它只会给出比String或Int32更多的定义。
更多的讨论而不是寻找答案。
干杯, 麦克
答案 0 :(得分:2)
或许最好只创建一种处理这种东西的新类型。您可以使用EmailAddress类型来验证构造或修改时获取的任何字符串参数。然后就不需要属性欺骗了。
答案 1 :(得分:0)
我不知道我是否曾经看过一个特殊的正则表达式作为契约 - 但它不是检查输入int有效范围或参数!= null等,这些都是DbC的标准票价
C#/ .NET具有官方的System.Diagnostics.Contracts Code Contracts。 Spec# 是一种添加了DbC的C#派生语言。我假设 .NET 4的代码合同大部分来自Spec# - 所以我不确定Spec#目前提供了多少。
我不是DbC的人 - 但是认为让你知道它可能是有用的;是的,伙计们正在这样做,是的,你的建议当然是可行和合理的(虽然电子邮件地址很难用正则表达式验证 - 所以你可能想要一个不同的例子。)