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