निम्नलिखित सामान्य ज्ञान हो सकता है मैं सिर्फ कमी थी, लेकिन एह। कुछ समय पहले, हमारे पास एक बग मामला था जिसमें आभासी गुण शामिल थे। संदर्भ को थोड़ा सा बढ़ाते हुए, निम्नलिखित कोड पर विचार करें, और निर्दिष्ट क्षेत्र में ब्रेकपॉइंट लागू करें:
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 { } }
}
में रहते हुए Derivedवस्तु संदर्भ, आप एक ही व्यवहार प्राप्त कर सकते हैं जब जोड़ने base.Propertyएक घड़ी, या टाइपिंग के रूप मेंbase.Property quickwatch में।
मुझे एहसास हुआ कि क्या चल रहा था। अंत में मैं क्विकवॉच द्वारा प्रबुद्ध था। क्विकवॉच में जाने और Derivedऑब्जेक्ट डी (या ऑब्जेक्ट के संदर्भ से this) की खोज और फ़ील्ड का चयन करते हुए base, क्विकवॉच के शीर्ष पर संपादित फ़ील्ड निम्नलिखित कलाकारों को प्रदर्शित करता है:
((TestProject1.Base)(d))
जिसका मतलब है कि अगर आधार को इस तरह बदल दिया जाता है, तो कॉल होगा
public string BaseProperty { get { return ((TestProject1.Base)(d)).Property; } private set { } }
घड़ियाँ, क्विकवॉच और डिबगिंग माउस-ओवर टूलटिप्स के लिए, और फिर यह बहुरूपता पर विचार "AWESOME"करने के बजाय इसे प्रदर्शित करने के लिए समझ में आता "BASE_AWESOME"है। मैं अभी भी अनिश्चित हूं कि इसे एक कास्ट में क्यों तब्दील किया जाएगा, एक परिकल्पना यह है कि callउन मॉड्यूल के संदर्भ से उपलब्ध नहीं हो सकता है, और केवलcallvirt ।
किसी भी तरह, यह स्पष्ट रूप से कार्यक्षमता के मामले में कुछ भी नहीं बदलता है, Derived.BasePropertyअभी भी वास्तव में वापस आ जाएगा "BASE_AWESOME", और इस तरह यह काम पर हमारे बग की जड़ नहीं था, बस एक भ्रमित घटक था। मुझे हालांकि यह दिलचस्प लगा कि यह कैसे विकासकर्ताओं को गुमराह कर सकता है जो अपने डिबग सत्रों के दौरान उस तथ्य से अनजान होंगे, विशेषकर यदि Baseआपकी परियोजना में उजागर नहीं किया गया है, बल्कि एक 3 डी डीएलएल के रूप में संदर्भित किया गया है, जिसके परिणामस्वरूप देव बस कह रहे हैं:
"ओई, रुको..क्यों? डीएमएल कि तरह है? .. कुछ अजीब लग रहा है"