Jeffrey Richter, CLR Via C # adlı mükemmel kitabında mülkleri sevmediğini ve kullanılmamasını tavsiye ettiğini söyledi. Bir sebep gösterdi ama gerçekten anlamıyorum. Biri bana neden mülkleri kullanıp kullanmamam gerektiğini açıklayabilir mi? Otomatik özelliklerle C # 3.0'da bu değişir mi?
Referans olarak Jeffrey Richter'in görüşlerini ekledim:
• Bir özellik salt okunur veya salt okunur olabilir; alan erişimi her zaman okunabilir ve yazılabilir. Bir özellik tanımlarsanız, en iyisi hem alma hem de erişimci ayarlama yöntemlerini sunmaktır.
• Bir özellik yöntemi bir istisna oluşturabilir; alan erişimi asla bir istisna atmaz.
• Bir özellik, bir yönteme out veya ref parametresi olarak aktarılamaz; bir alan olabilir. Örneğin, aşağıdaki kod derlenmeyecektir:
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);
}
}
• Bir özellik yönteminin yürütülmesi uzun zaman alabilir; alan erişimi her zaman hemen tamamlanır. Özelliklerin kullanılmasının yaygın bir nedeni, iş parçacığını sonsuza kadar durdurabilen iş parçacığı eşitlemesi yapmaktır ve bu nedenle, iş parçacığı eşitlemesi gerekiyorsa bir özellik kullanılmamalıdır. Bu durumda bir yöntem tercih edilir. Ayrıca, sınıfınıza uzaktan erişilebiliyorsa (örneğin, sınıfınız System.MashalByRefObject öğesinden türetilmişse), özellik yöntemini çağırmak çok yavaş olacaktır ve bu nedenle, bir özelliğe bir yöntem tercih edilir. Benim düşünceme göre, MarshalByRefObject'den türetilen sınıflar asla özellikleri kullanmamalıdır.
• Bir satırda birden çok kez çağrılırsa, bir özellik yöntemi her seferinde farklı bir değer döndürebilir; bir alan her seferinde aynı değeri döndürür. System.DateTime sınıfı, geçerli tarih ve saati döndüren salt okunur bir Now özelliğine sahiptir. Bu özelliği her sorguladığınızda, farklı bir değer döndürür. Bu bir hatadır ve Microsoft, Now'ı bir özellik yerine bir yöntem yaparak sınıfı düzeltebilmelerini ister.
• Bir özellik yöntemi, gözlenebilir yan etkilere neden olabilir; alan erişimi asla yapmaz. Başka bir deyişle, bir türden bir kullanıcı, bir tür tarafından tanımlanan çeşitli özellikleri, türdeki herhangi bir farklı davranışı fark etmeden seçtiği herhangi bir sırada ayarlayabilmelidir.
• Bir özellik yöntemi ek bellek gerektirebilir veya aslında nesnenin durumunun parçası olmayan bir şeye bir referans döndürebilir, bu nedenle döndürülen nesneyi değiştirmenin orijinal nesne üzerinde hiçbir etkisi olmaz; bir alanı sorgulamak, her zaman orijinal nesnenin durumunun bir parçası olduğu garanti edilen bir nesneye bir başvuru döndürür. Bir kopya döndüren bir özellikle çalışmak, geliştiriciler için çok kafa karıştırıcı olabilir ve bu özellik genellikle belgelenmez.