स्टेटिक विधियां तत्काल जैसी नहीं हैं, वे केवल ऑब्जेक्ट संदर्भ के बिना उपलब्ध हैं।
एक क्लास विधि के माध्यम से एक क्लास नाम के माध्यम से किया जाता है, ऑब्जेक्ट संदर्भ के माध्यम से नहीं, और इसे कॉल करने के लिए आईएल कोड उस वर्ग के नाम के माध्यम से अमूर्त विधि को कॉल करेगा जो परिभाषित करता है, आवश्यक रूप से आपके द्वारा उपयोग की जाने वाली कक्षा का नाम नहीं ।
मुझे एक उदाहरण दिखाएं।
निम्नलिखित कोड के साथ:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
यदि आप बी.टेस्ट को कॉल करते हैं, तो इस तरह:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
फिर मुख्य विधि के अंदर वास्तविक कोड निम्नानुसार है:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
जैसा कि आप देख सकते हैं, कॉल ए.टेस्ट को बनाया गया है, क्योंकि यह ए क्लास था जिसने इसे परिभाषित किया था, न कि बी.टेस्ट के लिए, भले ही आप इस तरह कोड लिख सकें।
यदि आपके पास वर्ग प्रकार था, जैसे डेल्फी में, जहां आप एक प्रकार का संदर्भ देने वाले चर को बना सकते हैं, न कि ऑब्जेक्ट, तो आपके पास वर्चुअल और इस प्रकार सार स्थिर विधियों (और रचनाकारों) के लिए अधिक उपयोग होगा, लेकिन वे उपलब्ध नहीं हैं और इस प्रकार स्थिर कॉल .NET में गैर-वर्चुअल हैं।
मुझे एहसास है कि आईएल डिजाइनर कोड को बी.टेस्ट पर कॉल करने के लिए संकलित करने की अनुमति दे सकते हैं, और रनटाइम पर कॉल को हल कर सकते हैं, लेकिन यह अभी भी वर्चुअल नहीं होगा, क्योंकि आपको अभी भी किसी प्रकार का क्लास नाम लिखना होगा।
वर्चुअल विधियां, और इस प्रकार सार तत्व, केवल तभी उपयोगी होते हैं जब आप चर का उपयोग कर रहे होते हैं, रनटाइम पर, कई अलग-अलग प्रकार की ऑब्जेक्ट्स हो सकती हैं, और आप इस प्रकार वेरिएबल में मौजूद वर्तमान ऑब्जेक्ट के लिए सही विधि को कॉल करना चाहते हैं। स्थैतिक तरीकों के साथ आपको किसी भी वर्ग के नाम से गुज़रने की ज़रूरत है, इसलिए कॉल करने की सटीक विधि संकलन समय पर जानी जाती है क्योंकि यह बदल नहीं सकती है और नहीं बदलेगी।
इस प्रकार, वर्चुअल / अमूर्त स्थैतिक विधियां .NET में उपलब्ध नहीं हैं।