Поддержка свойств и индексаторов является одним из основных преимуществ C # по сравнению с Java.
ей превосходной книге CLR Via C # Джеффри Рихтер сказал, что ему не нравятся свойства, и рекомендует не использовать их. Он привел причину, но я не совсем понимаю. Может кто-нибудь объяснить мне, почему я должен или не должен использовать свойства? В C # 3.0 с автоматическими свойствами это меняется?
В качестве ссылки я добавил мнение Джеффри Рихтера:
• свойство может быть только для чтения или только для записи; доступ к полю всегда читабелен и доступен для записи. Если вы определяете свойство, лучше всего предложить методы доступа и получить, и установить.
• метод свойства может вызвать исключение; доступ к полю никогда не вызывает исключение.
• Свойство не может быть передано как параметр 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 вместо свойства.
• Свойство метода может вызвать наблюдаемые побочные эффекты; доступ к полю никогда не делает. Другими словами, пользователь типа должен иметь возможность устанавливать различные свойства, определенные типом, в любом порядке, который он или она выбирает, не замечая какого-либо другого поведения в типе.
• Метод свойства может потребовать дополнительной памяти или вернуть ссылку на что-то, что на самом деле не является частью состояния объекта, поэтому изменение возвращаемого объекта не влияет на исходный объект; запрос поля всегда возвращает ссылку на объект, который гарантированно является частью состояния исходного объекта. Работа со свойством, которое возвращает копию, может быть очень запутанной для разработчиков, и эта характеристика часто не документируется.