Вопрос

Я ищу библиотеку или исходный код, предоставляющий методы защиты, такие как проверка нулевых аргументов.Очевидно, что это довольно просто построить, но мне интересно, есть ли уже какие-либо программы для .NET.Базовый поиск в Google мало что дал.

Это было полезно?

Решение

Существует CuttingEdge.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

Я не знаю ни одного из них, которые имеются в продаже. Существует некоторая поддержка этого типа кода в шаблонах & amp; практикует корпоративную библиотеку. Есть также много проектов с открытым исходным кодом, которые, по-видимому, также делают это (в разной степени) на CodePlex: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation .

В большинстве случаев эти типы библиотек создаются на заказ и остаются внутри компании, которая их использует.

В .NET 4.0 есть поддержка, которая предоставляет механизмы для этого с использованием контрактов кода , которые основаны на Spec #.

Недавно я написал пост о классах охраны (тоже не нашел никакой информации): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/

Я также опубликовал соответствующую реализацию класса Guard (вы можете использовать этот код как есть или адаптировать его под свои нужды):ajdotnet.wordpress.com/guard-class/

Что касается связи между классами Guard и Code Contract в .NET 4.0 (преемнике Spec#), посмотрите следующий пост:www.leading-edge-dev.de/?p=438

(извините за фрагментированные ссылки, на сайте разрешена только одна ссылка...)

ХИ, AJ.NET

Установите пакет nuget для netfx-guard. Вы также получаете фрагменты кода notnull и notempty, которые выполняются так же быстро, как и ваши ручные проверки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top