Различия между частными полями и частными объектами

В чем разница между использованием Private Properties вместо Private Fields

private String MyValue { get; set; }

// instead of

private String _myValue;

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

   // Instead of

   _myValue = "Test";
}

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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