Поддержка свойств и индексаторов является одним из основных преимуществ 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 вместо свойства.

• Свойство метода может вызвать наблюдаемые побочные эффекты; доступ к полю никогда не делает. Другими словами, пользователь типа должен иметь возможность устанавливать различные свойства, определенные типом, в любом порядке, который он или она выбирает, не замечая какого-либо другого поведения в типе.

• Метод свойства может потребовать дополнительной памяти или вернуть ссылку на что-то, что на самом деле не является частью состояния объекта, поэтому изменение возвращаемого объекта не влияет на исходный объект; запрос поля всегда возвращает ссылку на объект, который гарантированно является частью состояния исходного объекта. Работа со свойством, которое возвращает копию, может быть очень запутанной для разработчиков, и эта характеристика часто не документируется.

Ответы на вопрос(14)

Ваш ответ на вопрос