নিম্নলিখিতটি সাধারণ জ্ঞান হতে পারে আমার কেবলই অভাব ছিল, তবে হ্যাঁ but কিছু সময় আগে, আমাদের একটি বাগ কেস হয়েছিল যা ভার্চুয়াল বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে। প্রসঙ্গে কিছুটা বিমূর্ত করা, নিম্নলিখিত কোডটি বিবেচনা করুন এবং নির্দিষ্ট অঞ্চলে ব্রেকপয়েন্টটি প্রয়োগ করুন:
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
কুইকওয়াচে ।
কি চলছে তা বুঝতে আমাকে কিছুটা সময় নিল। শেষ পর্যন্ত আমি কুইকওয়াচ দ্বারা আলোকিত হয়েছি। কুইকওয়াচে যাওয়ার সময় এবং Derived
অবজেক্ট d (বা বস্তুর প্রসঙ্গ থেকে this
) অন্বেষণ এবং ক্ষেত্রটি নির্বাচন করার base
সময়, কুইকওয়াচের শীর্ষে সম্পাদনা ক্ষেত্রটি নিম্নলিখিত কাস্টটি প্রদর্শন করে:
((TestProject1.Base)(d))
যার অর্থ হ'ল যদি বেসটি এরূপে প্রতিস্থাপন করা হয় তবে কল হবে
public string BaseProperty { get { return ((TestProject1.Base)(d)).Property; } private set { } }
ওয়াচেস, কুইকওয়াচ এবং ডিবাগিং মাউস-ওভার টুলটিপসের জন্য, এবং তারপরে পলিমারফিজম বিবেচনা করার "AWESOME"
পরিবর্তে এটি প্রদর্শিত হবে "BASE_AWESOME"
বলে মনে হয়। আমি এখনও নিশ্চিত নই কেন এটি কেন এটি একটি castালাইতে রূপান্তরিত করবে, একটি অনুমানটি হ'ল এটি call
মডিউলগুলির প্রসঙ্গ থেকে পাওয়া যায় না এবং কেবল callvirt
।
যাইহোক, এটি স্পষ্টত কার্যকারিতার দিক থেকে কোনও কিছু পরিবর্তন করে না, Derived.BaseProperty
তবুও সত্যই ফিরে আসবে "BASE_AWESOME"
এবং এইভাবে এটি আমাদের বাগের মূল ছিল না, কেবল একটি বিভ্রান্তিকর উপাদান। তবে আমি এটি আকর্ষণীয় পেয়েছি যে এটি কীভাবে ডেভলপারদের বিভ্রান্ত করতে পারে যা তাদের ডিবাগ সেশনের সময় সেই সত্যটি সম্পর্কে অজানা হতে পারে, বিশেষত যদি Base
আপনার প্রকল্পে প্রকাশিত হয় না তবে তৃতীয় পক্ষের ডিএলএল হিসাবে উল্লেখ করা হয়, ফলস্বরূপ দেবগণ বলেছিলেন:
"ওয়, অপেক্ষা করুন .. কি? ওএমজি যে ডিএলএল এর মত, .. মজার কিছু"