Поддерживают ли автоматически реализованные свойства атрибуты? - PullRequest
6 голосов
/ 21 января 2009

Мне сказали, что в c # атрибуты не допускаются для автоматически реализуемых свойств. Это правда? если да, то почему?

РЕДАКТИРОВАТЬ: Я получил эту информацию из популярной книги о LINQ и не мог в это поверить! РЕДАКТИРОВАТЬ: Обратитесь к странице 34 LINQ, выпущенной Полом Киммелом, где он говорит: « Атрибуты не разрешены для автоматически реализуемых свойств, поэтому прокрутите свои собственные, если вам нужен атрибут »

Ответы [ 4 ]

12 голосов
/ 21 января 2009

Вы можете без проблем применять атрибуты к автоматическим свойствам.

Цитата из MSDN :

Атрибуты разрешены на автоматически реализованные свойства, но очевидно, не на полях поддержки так как те не доступны из ваш исходный код Если вы должны использовать атрибут на вспомогательном поле собственности, просто создайте регулярную свойство.

8 голосов
/ 21 января 2009

Самый простой способ доказать, что это неправильно, это просто проверить это:

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

Я предлагаю вам написать автору по электронной почте, чтобы он мог опубликовать его как опечатку. Если он имел в виду, что вы не можете применить атрибут к полю , это даст ему возможность объяснить более внимательно.

4 голосов
/ 14 января 2010

Я думаю, что автор имел в виду, что вы не можете применять пользовательские атрибуты к частному вспомогательному полю. Например, если вы хотите пометить автоматическое свойство как не сериализованное, вы не можете сделать это:

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

Этот код компилируется, но он не работает. Вы можете применить атрибут к самому свойству, но вы не можете применить его для резервного поля.

1 голос
/ 21 января 2009

Обратите внимание, что к любому свойству Automatic также будет применен атрибут CompilerGeneratedAttribute.

...