В своей прекрасной книге CLR Via C # Джеффри Рихтер сказал, что ему не нравятся свойства, и он рекомендует не использовать их. Он объяснил причину, но я не совсем понимаю. Может ли кто-нибудь объяснить мне, почему я должен или не должен использовать свойства? Изменилось ли это в C # 3.0 с автоматическими свойствами?
В качестве справки я добавил мнения Джеффри Рихтера:
• Свойство может быть доступно только для чтения или только для записи; доступ к полю всегда доступен для чтения и записи. Если вы определяете свойство, лучше всего предлагать методы доступа как get, так и set.
• Метод свойства может вызвать исключение; доступ к полю никогда не вызывает исключения.
• Свойство нельзя передать методу как параметр out или ref; поле может. Например, следующий код не будет компилироваться:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• Для выполнения метода свойства может потребоваться много времени; доступ к полю всегда завершается немедленно. Распространенной причиной использования свойств является выполнение синхронизации потока, которая может остановить поток навсегда, поэтому свойство не следует использовать, если требуется синхронизация потока. В этой ситуации предпочтительнее использовать метод. Кроме того, если к вашему классу можно получить удаленный доступ (например, ваш класс является производным от System.MashalByRefObject), вызов метода свойства будет очень медленным, и поэтому метод предпочтительнее свойства. На мой взгляд, классы, производные от MarshalByRefObject, никогда не должны использовать свойства.
• Если вызывается несколько раз подряд, метод свойства может каждый раз возвращать другое значение; поле каждый раз возвращает одно и то же значение. Класс System.DateTime имеет свойство Now только для чтения, которое возвращает текущую дату и время. Каждый раз, когда вы запрашиваете это свойство, оно будет возвращать другое значение. Это ошибка, и Microsoft желает, чтобы они могли исправить класс, сделав Now методом вместо свойства.
• Метод свойства может вызвать наблюдаемые побочные эффекты; доступа к полю никогда не бывает. Другими словами, пользователь типа должен иметь возможность устанавливать различные свойства, определяемые типом, в любом порядке, который он или она выбирает, не замечая какого-либо другого поведения в типе.
• Метод свойства может потребовать дополнительной памяти или вернуть ссылку на что-то, что на самом деле не является частью состояния объекта, поэтому изменение возвращенного объекта не влияет на исходный объект; запрос поля всегда возвращает ссылку на объект, который гарантированно является частью исходного состояния объекта. Работа со свойством, которое возвращает копию, может сбивать с толку разработчиков, и эта характеристика часто не документируется.