Библиотека классов .NET Guard? - PullRequest
15 голосов
/ 18 ноября 2008

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

Ответы [ 6 ]

12 голосов
/ 14 августа 2009

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

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

8 голосов
/ 18 ноября 2008

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

2 голосов
/ 18 ноября 2008

Есть несколько методов, которые вы можете использовать.

Мой фаворит использует Аспектно-ориентированное программирование. Проверьте PostSharp.

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

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

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

1 голос
/ 14 августа 2009

Я недавно написал пост о классах охраны (также не нашел никакой информации): 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

1 голос
/ 18 ноября 2008

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

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

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

0 голосов
/ 31 января 2012

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

...