В своей превосходной книге 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 имеет только для чтения
Теперь свойство, которое возвращает текущую дату и время. Каждый раз, когда вы запрашиваете это
свойство, он вернет другое значение. Это ошибка, и Microsoft желает, чтобы они
можно исправить класс, сделав метод Now вместо свойства.
• Метод свойств может вызывать наблюдаемые побочные эффекты; доступ к полю никогда не делает. В других
словами, пользователь типа должен иметь возможность устанавливать различные свойства, определенные типом, в любом
порядок, который он или она выбирает, не замечая никакого другого поведения в типе.
• Метод свойства может потребовать дополнительной памяти или вернуть ссылку на что-либо
это на самом деле не является частью состояния объекта, поэтому изменение возвращаемого объекта не имеет
влияние на исходный объект; запрос поля всегда возвращает ссылку на объект, который
гарантированно является частью состояния исходного объекта. Работа со свойством, которое
возвращает копию может быть очень запутанным для разработчиков, и эта характеристика часто
не задокументировано.