Трябва ли да се избягва използването на Property?


6

Браузвайки из форумите намерих интерсно четиво, свързано с ООП в C#. Това е извадка от книгата "CLR Via C#" на Jeffrey Richter, в която той описва защо не трябва да се ползват пропъртита. Държа да отбележа, че не съм съгласен с мнението му, но ми е интересно какво мислят по-запознатите с материята. Ето я и изавадката:

• A property may be read-only or write-only; field access is always readable and writable. If you define a property, it is best to offer both get and set accessor methods.

• A property method may throw an exception; field access never throws an exception.

• A property cannot be passed as an out or ref parameter to a method; a field can. For example, the following code will not compile:

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);
   }
}

• A property method can take a long time to execute; field access always completes immediately. A common reason to use properties is to perform thread synchronization, which can stop the thread forever, and therefore, a property should not be used if thread synchronization is required. In that situation, a method is preferred. Also, if your class can be accessed remotely (for example, your class is derived from System.MashalByRefObject), calling the property method will be very slow, and therefore, a method is preferred to a property. In my opinion, classes derived from MarshalByRefObject should never use properties.

• If called multiple times in a row, a property method may return a different value each time; a field returns the same value each time. The System.DateTime class has a readonly Now property that returns the current date and time. Each time you query this property, it will return a different value. This is a mistake, and Microsoft wishes that they could fix the class by making Now a method instead of a property.

• A property method may cause observable side effects; field access never does. In other words, a user of a type should be able to set various properties defined by a type in any order he or she chooses without noticing any different behavior in the type.

• A property method may require additional memory or return a reference to something that is not actually part of the object's state, so modifying the returned object has no effect on the original object; querying a field always returns a reference to an object that is guaranteed to be part of the original object's state. Working with a property that returns a copy can be very confusing to developers, and this characteristic is frequently not documented.




Отговори



2

Интересен спор е това :)

Според мен основното което трябвва да се осмисли за пропъртито е, че то е птосто метод (по-скоро двойка методи), който C# ни предоставя за удобство. От там нататък си е наша преценката дали и как го използваме според конкретната ситуация. Тук идва и объркването "какво връща пропъртито?!?!". Ако не мислим за него като метод а като поле, нещата описани като недостатъци са валидни (примерно няма консистентност на данните, веднъж връща едно а друг път друго), но ако мислим за него като метод - ами това се очаква от методите по принцип - да обработват и връщат различен резултат.


от kizisoft (803 точки)


2
Пропъртитата реално са два метода GetValue() и SetValue(object value) и са направени да са удобни и да си личат в кода от далеч с различен синтаксис. Това е все едно да ти кажат "не пиши методи, лоши са".

от ivaylo.kenov (30760 точки)


10
Авторът е много известен и преди време една от книгите му беше най-добрият източник за .NET.
Това на което набляга е разликата между полета и пропъртита. И как пропъртитата могат да бъдат объркващи, ако използващият ги, не обмисля какво са те всъщност, ами ги вижда като полета на обект.
Представи си че не си чувал за пропъртита, идваш от друг програмен език и нямаш идея че по правило не трябва да съществуват публични полета на клас. Почваш да пишеш нещо на .NET и най-интуитивно си достъпваш полета на обект (които реално са пропъртита) и ти се случват някакви странни неща (точно тези които се описват в точките).
Това е идеята на изказването. Не е нещо от сорта да не се използват пропъртита, просто да знаеш какво са те и да ги възприемаш по правилният начин. Единственото място на което казва, че не трябва да се ползват са при обекти наследяващи MarshalByRefObject и за синхронизация на нишки.