我不知道有多少次我必须编写代码来验证字符串参数:
public RoomName(string name)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException("Cannot be empty", "name");
}
}
无论如何要避免这种情况吗?是否有一些属性或设计合同机制来避免这种情况?没有办法说出来:
public RoomName(NotNullOrEmptyString name)
{
无需实际创建该类型?
答案 0 :(得分:7)
您可以通过代码注入属性来实现。
保存一些编码时间但仍然给你很多控制权的另一个选择是使用CuttingEdge.Conditions之类的东西。这为参数检查提供了流畅的接口,因此您可以编写:
name.Requires().IsNotNull();
答案 1 :(得分:1)
虽然问题已经回答了一段时间,但我最近一直在考虑同样的问题。形式化代码合同(带有自动验证或检查)似乎是一个好主意,但通常,它们的验证功能非常有限,对于像空字符串或空字符串检查这样的简单检查,它们需要的代码(或更多) )而不是老式的支票。
具有讽刺意味的是,我认为对于字符串大小写的最佳答案实际上是一个或两个类,它们包含一个已经被检查过的字符串,不是空,空或空格,并传递这个实例:
public class NonEmptyString : IComparable<NonEmptyString>, ...
{
private readonly string _value;
public NonEmptyString(string value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.Length == 0)
{
throw NewStringIsEmptyException("value");
}
_value = value;
}
public string Value
{
get { return _value; }
}
...
}
public class NonWhiteSpaceString : NonEmptyString
{
....
}
当然,绕过这些实例并不能阻止你自己检查它们是否为空,但它有一些很大的优点:
答案 2 :(得分:0)
另请参阅C#: How to Implement and use a NotNull and CanBeNull attribute以获取有关代码合同的更多信息,如何在VS2008中实施它们,以及如何将它们集成到VS2010中。