Если у вас есть свойство, которое получает и устанавливает переменную экземпляра, то обычно вы всегда используете свойство извне этого класса для доступа к нему.
Мой вопрос: следует ли вам всегда делать это в классе? Я всегда использовал свойство, если оно есть, даже внутри класса, но хотел бы услышать некоторые аргументы за и против, что является наиболее правильным и почему.
Или это просто вопрос стандартов кодирования, используемых в проекте?





Это зависит от того, хотите ли вы применить какую-либо логику, реализованную в установщике свойств, и поэтому вам действительно нужно принимать решение в каждом конкретном случае.
Когда вы переходите непосредственно к частному полю, вы знаете, что в поле устанавливается именно то, что вы говорите.
Когда вы просматриваете свойство, значение устанавливается в соответствии с логикой установщика, поэтому вы получаете любые бизнес-правила или проверку, которые хотите, по значениям, присвоенным этому полю.
Довольно сложно придумать правило о том, когда выполнение любого из них является «правильным», и я бы сказал, что единственное, чему я следую, - это то, что при инициализации конструктора я почти никогда не буду использовать свойство.
Думаю, это чисто предпочтение.
Тем не менее, я обнаружил, что использую свойства намного больше в C# 3.0 с поддержкой авто-свойств:
class Foo {
public string Value { get; set; }
public void Write() {
Console.Write(Value);
}
}
Автоматические свойства - интересная загвоздка - я люблю их, потому что они стабилизируют интерфейс, но я не мог предположить, как они влияют на использование внутренних свойств класса. Делают ли они более или менее вероятным, что я пропущу логику сеттера, которая может все испортить, или это то же самое?
По определению автоматические свойства не имеют логики установки, поэтому они функционально эквивалентны переменной-члену. Разница в том, что позже вы можете изменить реализацию и при необходимости ввести логику установки.
Да, я знаю, мне интересно, означают ли автоматические свойства (и всегда их использование), что, когда реализована логика установщика, она с большей вероятностью будет упущена из виду и вызовет проблемы. Не техническая проблема, просто вопрос «Что может заставить меня сделать глупую ошибку?»
Обычно в зависимости от стандартов кодирования проекта я использую "_" или "m" перед именем для атрибутов моего частного класса. (Как показано ниже)
private int mVariable;
private int _Variable;
С теми, кто находится перед переменной, я сразу понимаю, что имею дело с внутренней переменной для класса. Затем, когда дело доходит до отладки позже, я или кто-то другой может сразу распознать, что код имеет дело с внутренней частной переменной, и внести коррективы. Так что для меня все сводится к удобочитаемости.
_ делает их несовместимыми с CLS, я считаю
Соответствие @Selfinflicted CLS применяется только к общедоступным полям / методам / т. Д. Даже если соответствие CLS действительно применялось, внутренние имена полей удаляются при сборке в режиме выпуска в любом случае, поэтому нет никаких причин, которые имели бы значение.
Один из сильных аргументов в пользу доступа к локальным (область действия класса) переменным через свойства - это то, что вы добавляете уровень абстракции в свой класс. Если вы измените логику Любые, касающуюся того, как это поле хранится, остальная часть вашего кода останется нетронутой.
Например, вы можете изменить это с локальной переменной на свойство дочернего объекта, на вызов базы данных, на вызов веб-службы, на статическое свойство класса и так далее. При внесении изменения это дает вам единственную точку изменения, свойство, и вам не нужно обновлять остальную часть вашего класса, поскольку все они используют свойство.
Кроме того, использование свойства позволяет вам применять бизнес-правила к значению свойства вместо того, чтобы применять одно и то же правило в каждом месте, где вы напрямую обращаетесь к полю. Опять же, инкапсуляция
С введением автоматических свойств стало еще меньше причин явно иметь локальную переменную, если только вам не нужно применять бизнес-правила для получения / установки.
В этой связи мне бы очень хотелось иметь синтаксис языка для предотвращения прямого доступа к резервному полю, даже если по какой-то причине нельзя использовать автоматические свойства.
Да, я думаю, вам следует по возможности использовать внутренние свойства в своих классах. Свойства более гибкие и позволяют добавлять логику для проверки их значения в центральном месте.
Вы также можете отложить инициализацию поля до тех пор, пока свойство не будет использоваться, вместо того, чтобы принудительно делать это в конструкторе (или везде, где используется поле). Пример:
class Test {
private int _checksum = -1;
private int Checksum {
get {
if (_checksum == -1)
_checksum = calculateChecksum();
return checksum;
}
}
}
Всегда используйте свойства, вот некоторые из причин
Я думаю, вы неправильно поняли вопрос.
Хорошая точка зрения. Используйте это поле, если вы хотите обойти логику в свойстве.