2008-11-18 5 views
14

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

ответ

11

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

Другой хороший подход, который не упакован в библиотеке, но легко может быть, on Paint.Net blog:

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

Я использую его в my project и вы могли бы заимствовать код оттуда.

+0

Я отмечаю это как принятый ответ, потому что он, безусловно, соответствует моим потребностям. – 2011-04-21 03:42:00

8

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

2

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

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

Вы также можете посмотреть на SpeC#, это расширение C#

В 4.0, вы будете иметь полнофункциональную библиотеку контракта.

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

1

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

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

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

1

Недавно я написал пост о защитных классах (не найдя какую-либо информации либо): 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

0

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