इसमें 3 "सामान्य" प्रकार (हालांकि सभी वेब वास्तविक प्रकार के होते हैं) सी # में कर रहे हैं: वस्तु, वर और गतिशील।
वस्तु
एक वास्तविक प्रकार, किसी भी अन्य प्रकार की तरह, एक विशेष नियम के साथ: अगर एक प्रकार के वारिस नहीं है, यह वस्तु से विरासत। इस से, यह इस प्रकार है कि सभी प्रकार, वस्तु से विरासत प्रत्यक्ष या परोक्ष रूप।
जोर: वस्तु एक प्रकार है। एक ऑब्जेक्ट ऑब्जेक्ट प्रकार का हो सकता है, और इस प्रकार के तरीके ToString() जैसे हैं। चूंकि सबकुछ ऑब्जेक्ट से प्राप्त होता है, इसलिए सब कुछ ऑब्जेक्ट में उड़ाया जा सकता है। जब आप एक वस्तु संदर्भ के लिए एक वस्तु असाइन करते हैं, आप upcasting कर रहे हैं बस जब आप एक पशु संदर्भ जहां हाथीपशु से विरासत के लिए एक हाथी प्रकार वस्तु आवंटित की तरह।
SomeType x = new SomeType();
object obj = x;
obj.DoSomething();
- obj प्रकार वस्तु संकलन समय पर की जा रही है के रूप में माना जाता है, और प्रकार वस्तु कार्यावधि में (जो तार्किक है, क्योंकि यह एक वास्तविक प्रकार है के लिए किया जाएगा - objओब के रूप में, के रूप में वस्तु इतना ही नहीं प्रकार)
- obj.DoSomething() का हो सकता है एक संकलन समय त्रुटि का कारण होगा घोषित किया जाता है ject में यह विधि नहीं है, भले ही कुछ टाइप टाइप करें।
वार
यह एक वास्तविक प्रकार नहीं है, इसके लिए केवल आशुलिपि है "संकलक, असाइनमेंट के दाईं ओर के आधार पर मेरे लिए प्रकार यह पता लगाने"।
SomeType x = new SomeType();
var obj = x;
obj.DoSomething();
- obj "var" के बजाय प्रकार SomeType संकलन समय पर की जा रही है के रूप में माना जाता है, और प्रकार SomeType कार्यावधि में की हो जाएगा, जैसे कि आपने लिखा था "SomeType" ।
- अगर SomeType एक विधि DoSomething() है, इस कोड काम करेंगे
- अगर SomeType विधि नहीं है, कोड एक संकलन समय त्रुटि
कारण होगा गतिशील
यह एक ऐसा प्रकार है जो कंपाइलर को चर पर संकलन-समय प्रकार की जांच को अक्षम करने के लिए कहता है। संकलन-समय और रन-टाइम पर एक ऑब्जेक्ट को डायनामिक टाइप करने के रूप में माना जाता है।
SomeType x = new SomeType();
dynamic obj = x;
obj.DoSomething();
- obj प्रकार के समय
- DoSomething() है गतिशील संकलन पर और चलाते हैं SomeType एक विधि है, इस कोड काम करेंगे
- अगर SomeType नहीं करता ' टी विधि है, कोड संकलित होगा, लेकिन रन-टाइम
पर अपवाद फेंक देगा ई कि गतिशील बहुत आसानी से अपवाद पैदा कर सकता है अगर लापरवाही प्रयोग किया है: यदि एक्स एक प्रकार है कि DoSomething विधि नहीं है की है
public void f(dynamic x)
{
x.DoSomething();
}
यह एक अपवाद फेंक होगा, लेकिन यह अभी भी इसे कॉल करना संभव होगा और किसी ऑब्जेक्ट को संकलन-समय त्रुटि के बिना पैरामीटर के रूप में पास करना होगा, जिससे त्रुटि केवल रन-टाइम पर दिखाई देगी, और संभवतः केवल विशिष्ट परिस्थितियों में - एक संभावित बग। इसलिए यदि आप कक्षा के किसी भी प्रकार के सार्वजनिक इंटरफ़ेस में गतिशीलता का उपयोग करते हैं, तो आपको हमेशा प्रतिबिंब का उपयोग करके रनटाइम पर मैन्युअल रूप से टाइप-चेक करना चाहिए, ध्यान से अपवादों से निपटना चाहिए, या इसे पहले स्थान पर नहीं करना चाहिए।
नोट: ऑब्जेक्ट का उल्लेख कभी भी इसके प्रकार को कभी नहीं बदलता है। जबकि objऑब्जेक्ट, x हो सकता है कि यह अभी भी कुछ टाइप है।
आपको एक ही सूची में विषम वस्तुओं को स्टोर करने की आवश्यकता क्यों है? बस उत्सुक ... –
आपको डायनामिक बनाम ऑब्जेक्ट की तलाश करनी चाहिए, इस थ्रेड को देखें, शायद यह आपके उत्तर का जवाब देगा http://stackoverflow.com/questions/3442821/dynamic-vs-object-type – Habib
मेरे पास एक कक्षा है जहां एक गुणों का उस वर्ग के लिए प्रासंगिक वस्तुओं का संग्रह है जो एक ही प्रकार के नहीं हैं, लेकिन समूह के रूप में प्रासंगिक हैं। – Jason