Каков наилучший способ получить доступ к свойствам из того же класса, через средства доступа или напрямую?[закрыто]
-
21-08-2019 - |
Вопрос
Это то, в чем я не очень последователен, и мне всегда любопытно, что делают другие люди.
Как вы получаете доступ к внутренним свойствам (частным или общедоступным)?
Например, у вас есть это свойство :
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 изменено или обработано перед возвратом.
- Легко устанавливать точку останова, отлаживать и т.д.
- СУХОЙ:Ни один код не повторяется в том, что касается проверки и обработки.
- Устойчивость к изменениям:Изменение проверки и обработки не повлияет на код, использующий свойство.