我正在寻找提供保护方法(例如检查空参数)的库或源代码。显然,这很容易构建,但我想知道是否已经有任何 .NET 可用。一个基本的谷歌搜索并没有透露太多信息。
6 回答
有CutEdge.Conditions。页面中的使用示例:
public ICollection GetData(Nullable<int> id, string xml, ICollection col)
{
// Check all preconditions:
id.Requires("id")
.IsNotNull() // throws ArgumentNullException on failure
.IsInRange(1, 999) // ArgumentOutOfRangeException on failure
.IsNotEqualTo(128); // throws ArgumentException on failure
xml.Requires("xml")
.StartsWith("<data>") // throws ArgumentException on failure
.EndsWith("</data>"); // throws ArgumentException on failure
col.Requires("col")
.IsNotNull() // throws ArgumentNullException on failure
.IsEmpty(); // throws ArgumentException on failure
// Do some work
// Example: Call a method that should not return null
object result = BuildResults(xml, col);
// Check all postconditions:
result.Ensures("result")
.IsOfType(typeof(ICollection)); // throws PostconditionException on failure
return (ICollection)result;
}
另一种不错的方法,未打包在库中,但很容易在 Paint.Net 博客上:
public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
{
Validate.Begin()
.IsNotNull(dst, "dst")
.IsNotNull(src, "src")
.Check()
.IsPositive(length)
.IsIndexInRange(dst, dstOffset, "dstOffset")
.IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
.IsIndexInRange(src, srcOffset, "srcOffset")
.IsIndexInRange(src, srcOffset + length, "srcOffset + length")
.Check();
for (int di = dstOffset; di < dstOffset + length; ++di)
dst[di] = src[di - dstOffset + srcOffset];
}
我在我的项目中使用它,你可以从那里借用代码。
鉴于 Microsoft 的代码合同与 .NET 4.0 一起出现,如果可能的话,我会尝试找到一个最兼容的 - 如果没有,请自己编写。这样,当您(最终)升级到 .NET 4.0 时,迁移会更容易。
您可以使用多种方法。
我最喜欢的是使用面向方面的编程。查看 PostSharp。
您还可以查看 Spec#,它是 C# 的扩展
在 4.0 中,您将拥有一个功能齐全的合约库。
最后,我的一位同事提出了一个非常有用的保护库: http ://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48
我不知道任何商业上可用的。模式和实践企业库中对这种类型的代码有一些支持。CodePlex 上似乎也有很多开源项目(在不同程度上)这样做:http: //www.codeplex.com/Project/ProjectDirectory.aspx ?ProjectSearchText=validation 。
大多数情况下,这些类型的库最终都是自定义编写的,并保留在使用它们的公司内部。
.NET 4.0 支持使用基于 Spec# 的Code Contracts来提供执行此操作的机制。
我最近写了一篇关于警卫类的帖子(也没有找到任何信息):http ://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/
我还发布了相应的 Guard 类实现(随意使用此代码,或根据您的需要进行调整):ajdotnet.wordpress.com/guard-class/
关于 .NET 4.0(Spec# 的继承者)中 Guard 类和 Code Contract 之间的关系,请查看以下帖子:www.leading-edge-dev.de/?p=438
(对不起,碎片链接,该网站只允许一个链接......)
嗨,AJ.NET
安装 netfx-guard nuget 包。您还可以获得 notnull 和 notempty 的代码片段,它的执行速度与您的手动检查一样快