Различия между частными полями и частными свойствами
-
03-07-2019 - |
Вопрос
В чем разница между использованием частных свойств вместо частных полей
private String MyValue { get; set; }
// instead of
private String _myValue;
public void DoSomething()
{
MyValue = "Test";
// Instead of
_myValue = "Test";
}
Есть ли проблемы с производительностью?или просто соглашение об именах?
Решение
Частные свойства позволяют вам абстрагировать ваши внутренние данные, чтобы изменения во внутреннем представлении не затрагивали другие части вашей реализации, даже в том же классе.Частные поля не дают такого преимущества.Благодаря автоматическим свойствам в C# 3.0 я редко вижу необходимость в прямой реализации полей — частных или общедоступных.
Другие советы
Большая выгода, которую вы можете получить от свойства (частного, общественного и т. д.), заключается в том, что оно может давать расчетное значение, а неустановленное значение.Например
class Person {
private DateTime _birthday;
private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}
Преимущество этого шаблона заключается в том, что для отражения изменения необходимо обновить только одно значение из N других значений.Это справедливо для свойств независимо от доступности.Нет никаких особых преимуществ частной собственности перед нечастной собственностью (кроме того, что она, конечно, является частной).
Редко кому захочется сделать собственность частной.Положение о том, что собственность является частной, предусмотрено только для полноты картины.А если ваше свойство просто получает/устанавливает значение поля, то разницы в производительности нет, поскольку оно, скорее всего, будет встроено JIT-компилятором.
Помимо того, на что уже был дан ответ: «Производительность, симантика и полнота», есть один действительный случай, который я видел для частных свойств вместо частного поля:
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 по какой-либо причине, но мы также можем захотеть выполнить проверки.Должен ли родитель иметь возможность быть добавленным в качестве дочернего элемента к одному из своих дочерних элементов?
Чтобы решить эту проблему, вы можете сделать это свойством и выполнить проверку на наличие циклических ссылок.
Доступ к свойству будет (немного) медленнее, поскольку будет вызываться метод получения/установки.Преимущество заключается в том, что вы можете выполнять проверку данных, которая затем может фильтроваться по наследникам, например, если вы измените защищаемое свойство.
Когда речь идет о частном доступе, различия очень малы.Да, есть снижение производительности (которое может быть оптимизировано с помощью JIT): свойства отправки представляют собой вызов метода вместо прямого доступа к адресу.
Основное преимущество использования свойств — возможность изменения реализации без изменения необходимой внешней подписи.Поскольку к ним осуществляется частный доступ, любые изменения в реализации влияют только на локальный код.
Имея дело с частными участниками, я не вижу никаких преимуществ, получаемых от свойств, за исключением соглашений вашей команды.