Каков наилучший способ получить доступ к свойствам из того же класса, через средства доступа или напрямую?[закрыто]

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

Вопрос

Это то, в чем я не очень последователен, и мне всегда любопытно, что делают другие люди.

Как вы получаете доступ к внутренним свойствам (частным или общедоступным)?

Например, у вас есть это свойство :

Private _Name As String

Public Property Name() As String
    Get
        Return _Name
    End Get
    Set(ByVal value As String)
        _Name = value
    End Set
End Property

В том же классе внутри другой функции, какую из них вы предпочитаете?и почему?

_Name = "Johnny"

или

Name = "Johnny"

Игнорируйте тот факт, что я использовал Name вместо Me.Name .

Это было полезно?

Решение

Лично я предпочитаю использовать собственность там, где это возможно.Это означает, что вы по-прежнему получаете проверку, и вы можете легко установить точки останова для доступа к свойству.Это не делает работайте там, где вы пытаетесь внести изменения в два свойства, которые проверяются друг против друга - например, пара "min и max", где у каждого есть ограничение проверки, такое, что min <= max во все времена.Возможно, у вас есть (C #):

public void SetMinMax(int min, int max)
{
    if (max > min)
    {
        throw new ArgumentOutOfRangeException("max";
    }
    // We're okay now - no need to validate, so go straight to fields
    this.min = min;
    this.max = max;
}

В какой-то момент в будущем я бы хотел, чтобы C # получил возможность объявлять резервное поле внутри свойства таким образом, чтобы оно было закрытым для просто собственность:

public string Name
{
    string name;

    get { return name; }
    set
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }    
        name = value;
    }
}

За пределами собственности вы не смогли бы добраться до name вообще, только Name.У нас уже есть это для автоматически реализуемых свойств, но они не могут содержать никакой логики.

Другие советы

Я бы сказал

Name = "Johnny"

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

Я предпочитаю:

Name = "Johny"

Для меня причина довольно проста: если с _Name произойдет что-то плохое, вы всегда можете поместить некоторые выходные данные в getter / setter и выяснить, что вызывает проблему.

Это довольно интересно, я думаю, что большинство людей делают то же, что и я

Me.Name = "Johnny"

или

Name = "Johnny"

Однако большинство проектов, которые я видел с использованием

_Name = "Jonny"

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

Есть ли какой-то конкретный удар по производительности?Или компилятор оптимизирует его, когда в set или get нет дополнительного кода.

Используйте свойство (Name).Я считаю, что свойство должно быть единственным "владельцем" базового поля (_name).

Преимущества инкапсуляции поля под свойство:

  • Удобочитаемость:Только одна область кода, где _name изменено или обработано перед возвратом.
  • Легко устанавливать точку останова, отлаживать и т.д.
  • СУХОЙ:Ни один код не повторяется в том, что касается проверки и обработки.
  • Устойчивость к изменениям:Изменение проверки и обработки не повлияет на код, использующий свойство.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top