Различия между частными полями и частными объектами
В чем разница между использованием 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, представляет собой вызов метода, а не прямой адрес доступа.
Основным преимуществом использования свойств является возможность изменения реализации без изменения требуемой внешней подписи. Поскольку они находятся в частном доступе, любые изменения в реализации влияют только на локальный код.
Когда вы работаете с частными членами, я не вижу преимуществ, получаемых от свойств, кроме ваших команд.