2009-01-21 13 views
5

Me dijeron que en C# los atributos no están permitidos en las propiedades implementadas automáticamente. ¿Es eso cierto? si es así ¿por qué?¿Los atributos de compatibilidad de propiedades implementadas automáticamente?

EDIT: ¡Obtuve esta información de un libro popular en LINQ y no podía creerlo! EDIT: Consulte la página 34 de LINQ desatada por Paul Kimmel donde dice "Los atributos no están permitidos en las propiedades de auto-aplicado, por lo liar si necesita un atributo"

+0

¿Podría decir * exactamente * qué información es? (Creo que sería justo dar el nombre y la referencia del libro, por cierto.) –

+0

Acostúmbrate a creerlo, en el texto y en las herramientas. Todos cometemos errores. Recuerdo que en el día el compilador de Turbo C++ 1.0 tenía una fuga de memoria interna en el constructor de copia (o algo relacionado con eso). No podía creer que fuera culpa del compilador y no un error en el código fuente hasta que lo probé. Lo arreglaron en la próxima versión. –

Respuesta

7

La forma más fácil de probar que está mal es que acaba de probarlo:

using System; 
using System.ComponentModel; 
using System.Reflection; 

class Test 
{ 
    [Description("Auto-implemented property")] 
    public static string Foo { get; set; } 

    static void Main(string[] args) 
    { 
     var property = typeof(Test).GetProperty("Foo"); 
     var attributes = property.GetCustomAttributes 
       (typeof(DescriptionAttribute), false); 

     foreach (DescriptionAttribute description in attributes) 
     { 
      Console.WriteLine(description.Description); 
     } 
    } 
} 

le sugiero que enviar por correo electrónico al autor para que pueda publicarlo como una errata. Si quiso decir que no puede aplicar un atributo al campo , esto le dará la oportunidad de explicarlo con más cuidado.

12

es posible aplicar atributos a las propiedades automáticas sin un problema.

Presupuesto de MSDN: Se permiten

atributos en propiedades implementadas automáticamente, pero obviamente no en los campos de respaldo desde los que no son accesibles desde su código fuente. Si debe usar un atributo en el campo de respaldo de una propiedad , solo cree una propiedad regular .

1

Tenga en cuenta también que cualquier propiedad automática tendrá el CompilerGeneratedAttribute aplicado también.

3

Creo que el autor significa que no puede aplicar atributos personalizados al campo de respaldo privado. Por ejemplo, si desea marcar propiedad automática como no serializado, no se puede hacer esto:

[Serializable] 
public class MyClass 
{ 
    [field:NonSerializedAttribute()] 
    public int Id 
    { 
     get; 
     private set; 
    } 
} 

Este código se compila, pero no funciona. Usted puede aplicar atributo a la propiedad en sí, pero usted no puede aplicarlo para el campo de respaldo.

+0

Este no es el mejor. Incluso tenemos la directiva 'field:' ya! –

+0

No se puede obtener el comentario :) Tenemos una directiva 'campo;', pero esta directiva no hará nada por la propiedad con campo de respaldo. –

+1

¡Mis disculpas! Quise decir que desearía que la sintaxis de tu ejemplo funcionara :) –

Cuestiones relacionadas