remarks generate example c# attributes null

generate - C#: Cómo implementar y usar un atributo NotNull y CanBeNull



params comments c# (4)

En el mediano plazo, los "contratos de código" (en 4.0) serán una mejor respuesta a esto. Están disponibles ahora (con licencias académicas o comerciales ), pero estarán más integrados en VS2010. Esto puede proporcionar tanto análisis estático como soporte en tiempo de ejecución.

(editar) ejemplo:

Contract.RequiresAlways( x != null );

Tan simple como eso ... el motor de contratos de código funciona en el nivel IL, por lo que puede analizar eso y arrojar advertencias / errores del código de llamada durante la compilación, o en tiempo de ejecución. Para compatibilidad con versiones anteriores, si tiene un código de validación existente, puede indicarle dónde termina la comprobación de cordura y hará el resto:

if ( x == null ) throw new ArgumentNullException("x"); Contract.EndContractBlock();

Quiero que los programadores y yo sepamos que un método no quiere null y si envía null a él de todos modos, el resultado no será bonito.

Hay un NotNullAttribute y un CanBeNullAttribute en las bibliotecas compartidas Lokad , en el espacio de nombres Lokad.Quality .

pero como funciona? Miré el código fuente de esos dos atributos, y se ve así:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] [NoCodeCoverage] public sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)] [NoCodeCoverage] public sealed class CanBeNullAttribute : Attribute { }

Dos clases vacías que heredan de Attribute . ¿Cómo se usan? ¿Tienes que buscar la documentación xml y saber que está allí? Porque intenté hacer mi propia copia del atributo y usar la versión de Lokad, pero cuando traté de enviar un nulo directamente, no recibí ningún mensaje. Ni de ReSharper ni de VS. Lo que esperaba en realidad. Pero, ¿cómo se usan? ¿De alguna manera puedo hacer que VS genere advertencias para mí si trato de enviar algo que es nulo allí? ¿O solo se usa en algún tipo de marco de prueba? ¿O?


Esto se puede hacer con AOP , mediante el cual un Asesoramiento verifica en el tiempo de ejecución si un parámetro de método es nulo y si se permiten nulos. Ver PostSharp y Spring.NET para AOP.

En cuanto a ReSharper, vea el Marco anotado :

Hemos analizado una gran parte de .NET Framework Class Library, así como NUnit Framework, y lo hemos anotado a través de archivos XML externos, utilizando un conjunto de atributos personalizados del espacio de nombres JetBrains.Annotations, específicamente:

  • StringFormatMethodAttribute (para los métodos que toman cadenas de formato como parámetros)
  • InvokerParameterNameAttribute (para los métodos con argumentos literales de cadena que deben coincidir con uno de los parámetros de la persona que llama)
  • AssertionMethodAttribute (para los métodos de aserción)
  • AssertionConditionAttribute (para los parámetros de condición de los métodos de aserción)
  • TerminatesProgramAttribute (para los métodos que terminan el flujo de control)
  • CanBeNullAttribute (para valores que pueden ser nulos)
  • NotNullAttribute (para valores que no pueden ser nulos)

Estas anotaciones son para ReSharper, y se copian del espacio de nombres JetBrains.Anotaciones. Un marco puede ponerlos en su propio espacio de nombres, sin embargo, ReSharper NO recogerá estas anotaciones automáticamente; necesita decirle a ReSharper que use el espacio de nombres personalizado en el cuadro de diálogo de opciones. Una vez que haya seleccionado el nuevo espacio de nombres, el análisis de ReSharper recogerá los atributos y le dará destacados y advertencias.


Como señaló Anton Gogolev , los atributos se pueden crear usando PostSharp. (Tenga en cuenta que CodeContract está utilizando llamadas a métodos estáticos dentro del cuerpo del método)

ACTUALIZACIÓN Feb 2013: nueva versión 3.0 de PostSharp (actualmente en Beta) soportará la validación de parámetros, campos y propiedades

1) El artículo validate-parameters-using-attributes tiene implementación de

clase pública NotEmpty: ParameterAttribute

clase pública NotNull: ParameterAttribute

[AttributeUsage (AttributeTargets.Parameter)]

clase abstracta pública ParameterAttribute: Attribute

{

public abstract void CheckParameter(ParameterInfo parameter, object value);

}

También requirió un atributo de método con un aspecto de límite de método para procesar los atributos de parámetro.

2) En el comentario al artículo hay enlaces a una implementación muy similar para NonNull / NonEmpty

[return: NonNull] public SomeObject SomeMethod ([NonNull] AnotherObject param1)

El código fuente se encuentra en el código de google Torch / DesignByContract

3) otro ejemplo más complicado se describe en http://badecho.com/2011/11/validating-method-parameters-with-postsharp/