Подтвердить что ты не робот

Библиотека классов .NET Guard?

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

4b9b3361

Ответ 1

Существует 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];
}

Я использую его в моем проекте, и вы можете взять код оттуда.

Ответ 2

Учитывая Microsoft Кодовые контракты, выходящие с .NET 4.0, я попытаюсь найти тот, который в большинстве случаев совместим, если это возможно - и если нет, напишите сами. Таким образом, при обновлении до .NET 4.0 (в конечном итоге) миграция будет проще.

Ответ 3

Можно использовать несколько методов.

Моим любимым является использование Aspect Oriented Programming. Проверьте PostSharp.

Вы также можете взглянуть на SpeС#, расширение на С#

В 4.0 у вас будет полнофункциональная библиотека контрактов.

Наконец, мой коллега придумал довольно полезную библиотеку охраны: http://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48

Ответ 4

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

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

В .NET 4.0 есть поддержка, обеспечивающая механизмы для этого, используя Code Contracts, которые основаны на SpeС#.

Ответ 5

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

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

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

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

Е.И.В., AJ.NET

Ответ 6

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