Различия между частными полями и частной собственностью - PullRequest
35 голосов
/ 04 января 2009

В чем разница между использованием частных свойств вместо частных полей

private String MyValue { get; set; }

// instead of

private String _myValue;

public void DoSomething()
{
   MyValue = "Test";

   // Instead of

   _myValue = "Test";
}

Есть ли проблемы с производительностью? или просто соглашение об именах?

Ответы [ 6 ]

26 голосов
/ 04 января 2009

Частные свойства позволяют вам абстрагировать ваши внутренние данные, чтобы изменения во внутреннем представлении не влияли на другие части вашей реализации, даже в том же классе. Частные поля не предлагают этого преимущества. Благодаря автоматическим свойствам в C # 3.0 я редко вижу необходимость реализации полей напрямую - private или public.

19 голосов
/ 04 января 2009

Большая выгода, которую вы можете получить от свойства (private, public, ...), состоит в том, что оно может производить вычисленное значение по сравнению с установленным значением. Например

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}

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

11 голосов
/ 04 января 2009

Вы редко хотели бы сделать собственность частной. Положение о частной собственности предоставляется только для полноты. И если ваше свойство просто получает / устанавливает значение поля, то разницы в производительности нет, потому что он, скорее всего, будет встроен компилятором JIT.

4 голосов
/ 04 января 2009

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

public class Item
{
    private Item _parent;
    private List<Item> _children;

    public void Add(Item child)
    {
        if (child._parent != null)
        {
            throw new Exception("Child already has a parent");
        }
        _children.Add(child);
        child._parent=this;
    }
}

Допустим, мы не хотим показывать Parent по какой-либо причине, но мы также можем захотеть сделать проверку достоверности. Может ли родитель быть добавлен в качестве ребенка к одному из своих детей?

Чтобы решить эту проблему, вы можете сделать это свойством и выполнить проверку для циклических ссылок.

0 голосов
/ 04 января 2009

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

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

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

0 голосов
/ 04 января 2009

Доступ к свойству будет (частично) медленнее, так как вызовет метод получения / установки. Преимущество состоит в том, что вы можете выполнять проверку данных, которая затем может быть отфильтрована до наследников, если вы, например, измените свойство, которое нужно защитить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...