Aşağıdakiler sadece eksik olduğum genel bilgi olabilir, ama ha. Bir süre önce, sanal özellikleri içeren bir hata vakamız vardı. Bağlamı biraz soyutlamak, aşağıdaki kodu göz önünde bulundurun ve belirtilen alana kesme noktası uygulayın:
class Program
{
static void Main(string[] args)
{
Derived d = new Derived();
d.Property = "AWESOME";
}
}
class Base
{
string _baseProp;
public virtual string Property
{
get
{
return "BASE_" + _baseProp;
}
set
{
_baseProp = value;
//do work with the base property which might
//not be exposed to derived types
//here
Console.Out.WriteLine("_baseProp is BASE_" + value.ToString());
}
}
}
class Derived : Base
{
string _prop;
public override string Property
{
get { return _prop; }
set
{
_prop = value;
base.Property = value;
} //<- put a breakpoint here then mouse over BaseProperty,
// and then mouse over the base.Property call inside it.
}
public string BaseProperty { get { return base.Property; } private set { } }
}
İken Derivedeklerken nesne bağlamında, aynı davranışı elde edebilirsiniz base.Propertybir saat ya da yazmaya olarak base.PropertyQuickWatch içine.
Neler olduğunu anlamam için biraz zamanımı aldı. Sonunda Quickwatch tarafından aydınlandım. Quickwatch'a girip Derivedd nesnesini (veya nesnenin bağlamından this) basekeşfedip alanı seçerken , Quickwatch'ın üstündeki düzenleme alanı aşağıdaki yayını görüntüler:
((TestProject1.Base)(d))
Bu, taban bu şekilde değiştirilirse, çağrı
public string BaseProperty { get { return ((TestProject1.Base)(d)).Property; } private set { } }
Saatler, Quickwatch ve hata ayıklama fareyle üzerine gelme ipuçları için "AWESOME"kullanıldığında, "BASE_AWESOME"polimorfizm düşünüldüğünde bunun görüntülenmesi mantıklı olacaktır . Neden onu alçıya dönüştüreceğinden emin değilim, bir hipotez, callbu modüllerin bağlamında bulunmayabilir ve sadece callvirt.
Her neyse, bu işlevsellik açısından hiçbir şeyi değiştirmiyor Derived.BaseProperty, yine de gerçekten geri dönecek "BASE_AWESOME"ve bu yüzden bu, işimizdeki böceğimizin kökü değildi, sadece kafa karıştırıcı bir bileşen. Ancak, özellikle Baseprojenizde açığa çıkmamış, ancak 3. taraf DLL olarak atıfta bulunmuşsa, Devs sadece şunu söyleyerek , hata ayıklama oturumları sırasında bu gerçeğin farkında olmayacak geliştiricileri nasıl yanlış yönlendirebileceğini ilginç buldum :
"Oi, bekle .. ne? Omg DLL böyle, komik bir şey yapmak"