2010-05-25 3 views
10
  1. Может кто-нибудь объяснить мне, в чем заключается идея использования Auto-Implemented Properties C#?Автореализованные свойства C#

    public class Customer 
    { 
        public int ID { get; set; } 
        public string Name { get; set; } 
    } 
    

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

  2. Есть ли разница между определением поля, которое должно быть «public const», или определить его как свойство get-only?

+1

Возможный дубликат [C#: в чем смысл наличия публичного имущества] (http://stackoverflow.com/questions/2901591/c-what-is-the-point-in-having-a-purely -публичная недвижимость) –

+0

И http://stackoverflow.com/questions/1277572, http://stackoverflow.com/questions/1272521, http://stackoverflow.com/questions/1180860 и многие другие –

+0

Возможный дубликат [Разница между свойством и полем в C# 3.0+] (http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal

ответ

16

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

Таким образом, автоматические свойства являются просто удобной отправной точкой для любого простого члена класса, не относящегося к частному классу, что позволяет дополнительно добавить логику при сохранении совместимости с двоичными файлами.

5

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

+0

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

2

Я позволю MSDN сделать разговор здесь ....

«В C# 3.0 и позже, авто Реализуемого свойство делают свойство декларирования более кратким, когда никакой дополнительная логика не требуется аксессорах собственности. Они также, чтобы клиентский код создавал объекты. Когда вы объявляете свойство, как показано в следующем примере (см., например, статью MSDN), , компилятор создает частное, анонимное поле поддержки, доступ к которому можно получить только через get и set accessors свойства "

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

Есть ли разница между определением поля, которое должно быть «public const», или определить его как свойство get-only?

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

1

2: public comp должен быть определен в compiletime, вы не можете использовать для этого ссылочные объекты. Только классы, наследуемые от System.ValueType (строки, INT, двойного, ...)

Константного также статическая, тогда как свойство только геттер не является (каждый класс имеет свой собственный экземпляр.)

0

Что касается 1: рекомендуется использовать автоматически реализованные свойства, так как позже вы можете реализовать дополнительную логику, не нарушая изменений. Пример для этого можно найти по адресу Learning about Auto-Implemented Properties

3

Автоматически реализованные свойства представляют собой, по существу, синтаксический сахар. После компиляции существует резервное хранилище. Он просто не доступен из исходного кода.

Как указывали другие, свойства и поля не эквивалентны. Поля и свойства несовместимы, поэтому изменение между ними является нарушением изменений. Кроме того, вы не можете использовать привязку данных к полям.

Конечная точка. Хотя в вашем случае существует небольшая функциональная разница между примером и публичным полем, вы можете изменить видимость одного из аксессуаров. Таким образом, чтобы создать свойство только для чтения с помощью автоматического свойства, вы можете сделать что-то вроде:

public int ID { get; private set; } 

В этом случае прибудет аксессор является общедоступным, согласно всей подписи, но набор аксессор является частным.

Смежные вопросы