2010-02-27 8 views
25

हमें सी # में extern alias कीवर्ड का उपयोग कब करना चाहिए?हमें सी # में बाहरी उपनाम कीवर्ड का उपयोग कब करना चाहिए?

+1

@masoud ramezani +1 आपके प्रश्न के लिए ... –

+1

यहां इस विषय पर एक लेख है: http://en.csharp-online.net/ECMA-334:_16.3_Extern_alias_directives –

उत्तर

22

असल में आपको केवल वास्तव में इसकी आवश्यकता होती है जब आप अलग-अलग असेंबली से एक ही पूर्णतः योग्य नाम (समान नामस्थान, समान प्रकार का नाम) के साथ दो प्रकार का उपयोग करना चाहते हैं। आप प्रत्येक असेंबली के लिए एक अलग उपनाम घोषित करते हैं, ताकि आप उन्हें उस उपनाम के माध्यम से संदर्भित कर सकें।

जरूरत नहीं कहने के लिए है, तो आप उस स्थिति में हो रही :)

एंसन होर्टन के साथ शुरू करने के लिए से बचने के लिए प्रयास करना चाहिए इसके बारे में एक good blog post है।

+0

बस जोड़ने के लिए - बाहरी जोड़ने के बाद भी comsumer * .cs फ़ाइल के शीर्ष पर उपनाम घोषणा, डिफ़ॉल्ट रूप से कंपाइलर उस प्रकार की तलाश नहीं करता है जिसका उपयोग मैं कर रहा हूं (जो उस असेंबली में मौजूद है)। कॉम्पाइलर का डिफ़ॉल्ट व्यवहार हमेशा कक्षाओं और प्रकारों को खोजना है और 'ग्लोबल' उपनाम वाले असेंबली का संदर्भ दिया। मैं बाहरी उपनाम नाम से शुरू होने वाले पूर्णतः योग्य प्रकार के नाम का उपयोग कर समाप्त करता हूं मेरी बाहरी उपनाम घोषणा 'बाहरी उपनाम विजेट्स विक्रेता 1 थी;' और फिर भी मैं 'var wid = new widgetsVendor1.Widgets.Widget(); जैसे कोड लिख रहा था;' मैं बस नहीं कर सकता- 'vv wid = new widgets.Widget() ; ' – RBT

+1

@ आरबीटी: नहीं, यह केवल * उपनाम * घोषित करता है। लेकिन फिर आप 'widgetsVendor1.Widgets का उपयोग कर सकते हैं;' और 'var wid = new widget(); 'लिखें। –

+0

ओह। दिलचस्प! मुझे यह नहीं पता था। मैंने अपनी टिप्पणियों को सुबह में अपने अवलोकन के आधार पर पोस्ट किया था। जानकर खुशी हुई। मैं 'उपयोग' कीवर्ड का उपयोग कर बाहरी उपनाम के अंदर नामस्थान आयात करने में सक्षम हूं। धन्यवाद। – RBT

23

यह आपको संस्करण द्वारा खोए गए वास्तव में गहरे छेद से बाहर निकलने में मदद करने के लिए है। अपने कार्यक्रम के अपने पहले संस्करण इस वर्ग

using System; 

namespace Acme.Financial.Banking { 
    [Serializable] 
    public class BankAccount { 
    public double Balance { get; set; } 
    //... 
    } 
} 

का उपयोग करता है कहो और अगर आप बैंक के बहुत सारे serializing किया गया है इसके साथ रिकॉर्ड खातों। और एक एकाउंटेंट बैलेंस शीट एक पैसा की billionth द्वारा बंद किया जा रहा है के बारे में शिकायत शुरू होता है, तो आप वर्ग बदलने के लिए:

public decimal Balance { get; set; } 

समस्या हल, अगले ग्राहक खुश बैलेंस शीट है। जब तक आपको किसी मौजूदा ग्राहक को पुराने प्रारूप में बहुत सी धारावाहिक रिकॉर्ड के साथ अपग्रेड करने के लिए कहा नहीं जाता है। बड़ी समस्या, कक्षा बदल गई है, इसलिए आप अब रिकॉर्ड को deserialize नहीं कर सकते हैं।

बाहरी उपनाम आपकी समस्या हल करता है, तो आप अपने कोड में पुराने संस्करण और कक्षा के नए संस्करण दोनों को संदर्भित कर सकते हैं, भले ही नामस्थान नाम और कक्षा के नाम समान हों।

+1

बाहरी उपनाम का उपयोग करने के लिए बहुत अंतर्दृष्टिपूर्ण उपयोग-मामला। – RBT

संबंधित मुद्दे