standard new net features .net code-contracts

new - .NET Guard Class Library?



c# 8 (6)

Estoy buscando una biblioteca o código fuente que proporcione métodos de protección, como la comprobación de argumentos nulos. Obviamente, esto es bastante simple de construir, pero me pregunto si ya hay algo para .NET. Una búsqueda básica de Google no reveló mucho.


Hay varios métodos que puede usar.

Mi favorito es usar la Programación Orientada a Aspectos. Echa un vistazo a PostSharp.

También puede echar un vistazo a Spec #, una extensión de C #

En 4.0, tendrá una biblioteca de contratos con todas las funciones.

Finalmente, un colega mío ha creado una biblioteca de guardias bastante útil: http://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48


No conozco ninguno que esté disponible comercialmente. Existe algún tipo de soporte para este tipo de código en los patrones y prácticas de Enterprise Library. También hay muchos proyectos de código abierto que parecen hacer esto también (en diversos grados) en CodePlex: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation .

La mayoría de las veces, este tipo de bibliotecas terminan siendo escritas a medida y se mantienen internas a la compañía que las usa.

Hay soporte en .NET 4.0 para proporcionar mecanismos para hacer esto usando Contratos de código , que se basan en Spec #.


Teniendo en cuenta que los Contratos de Código de Microsoft saldrían con .NET 4.0, trataría de encontrar uno que, en lo posible, sea compatible, y si no, escríbalo usted mismo. De esta forma, cuando actualice a .NET 4.0 (eventualmente) la migración será más fácil.


Hace poco escribí una publicación sobre clases de guardias (que tampoco he encontrado ninguna información): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/

También publiqué una implementación de la clase Guard respectiva (puede usar este código tal como está o ajustarlo a sus necesidades): ajdotnet.wordpress.com/guard-class/

Con respecto a la relación entre las clases Guard y Code Contract en .NET 4.0 (sucesor de Spec #), eche un vistazo a la siguiente publicación: www.leading-edge-dev.de/?p=438

(perdón por los enlaces fragmentados, el sitio solo permitió un enlace ...)

HIH, AJ.NET


Hay CuttingEdge.Conditions . Ejemplo de uso de la página:

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

Otro buen enfoque, que no está empaquetado en una biblioteca, pero podría serlo fácilmente, en el blog de 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]; }

Lo uso en mi proyecto y puedes tomar prestado el código desde allí.


Instala el paquete nuget netfx-guard. También obtienes fragmentos de código notnull y notempty, y funciona tan rápido como tus cheques manuales