У своїй чудовій книзі CLR Via C # Джефрі Ріхтер сказав, що йому не подобаються властивості, і рекомендує не користуватися ними. Він чомусь дав, але я не дуже розумію. Хтось може мені пояснити, чому я повинен чи не повинен використовувати властивості? У C # 3.0, з автоматичними властивостями, це змінюється?
В якості довідки я додав думку Джеффрі Ріхтера:
• властивість може бути лише для читання або лише для запису; доступ до поля завжди читабельний і доступний для запису. Якщо ви визначаєте властивість, найкраще запропонувати методи отримання та встановлення доступу.
• метод властивості може кинути виняток; доступ до поля ніколи не кидає виняток.
• Властивість не може бути передана методу як вихід або 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 має властивість readonly Now, яка повертає поточну дату та час. Кожен раз, коли ви запитуєте цей ресурс, він повертає інше значення. Це помилка, і Microsoft бажає, щоб вони могли виправити клас, зробивши метод замість властивості.
• Метод властивості може спричинити помітні побічні ефекти; доступ до поля ніколи не відбувається. Іншими словами, користувач типу повинен мати можливість встановлювати різні властивості, визначені типом, у будь-якому обраному ним порядку, не помічаючи різної поведінки у типі.
• метод властивості може вимагати додаткової пам'яті або повернути посилання на те, що насправді не є частиною стану об'єкта, тому зміна повернутого об'єкта не впливає на вихідний об'єкт; запит на поле завжди повертає посилання на об'єкт, який гарантовано є частиною початкового стану об'єкта. Робота з властивістю, яка повертає копію, може бути дуже заплутаною для розробників, і ця характеристика часто не задокументована.