Различия между частными полями и частными свойствами

StackOverflow https://stackoverflow.com/questions/411048

  •  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): свойства отправки представляют собой вызов метода вместо прямого доступа к адресу.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top