18

我正在寻找提供保护方法(例如检查空参数)的库或源代码。显然,这很容易构建,但我想知道是否已经有任何 .NET 可用。一个基本的谷歌搜索并没有透露太多信息。

4

6 回答 6

12

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];
}

我在我的项目中使用它,你可以从那里借用代码。

于 2009-08-14T10:16:27.500 回答
8

鉴于 Microsoft 的代码合同与 .NET 4.0 一起出现,如果可能的话,我会尝试找到一个最兼容的 - 如果没有,请自己编写。这样,当您(最终)升级到 .NET 4.0 时,迁移会更容易。

于 2008-11-18T17:24:36.670 回答
2

您可以使用多种方法。

我最喜欢的是使用面向方面的编程。查看 PostSharp。

您还可以查看 Spec#,它是 C# 的扩展

在 4.0 中,您将拥有一个功能齐全的合约库。

最后,我的一位同事提出了一个非常有用的保护库: http ://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48

于 2008-11-18T17:25:53.207 回答
1

我不知道任何商业上可用的。模式和实践企业库中对这种类型的代码有一些支持。CodePlex 上似乎也有很多开源项目(在不同程度上)这样做:http: //www.codeplex.com/Project/ProjectDirectory.aspx ?ProjectSearchText=validation 。

大多数情况下,这些类型的库最终都是自定义编写的,并保留在使用它们的公司内部。

.NET 4.0 支持使用基于 Spec# 的Code Contracts来提供执行此操作的机制。

于 2008-11-18T17:26:57.557 回答
1

我最近写了一篇关于警卫类的帖子(也没有找到任何信息):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

于 2009-08-14T06:32:48.853 回答
0

安装 netfx-guard nuget 包。您还可以获得 notnull 和 notempty 的代码片段,它的执行速度与您的手动检查一样快

于 2012-01-31T12:40:39.350 回答