2011-11-05 13 views
9

मैंने कुछ लेख पढ़े जो कहते हैं कि सी # 3.0 में नामित तर्कों के परिचय के साथ, पैरामीटर का नाम अब सार्वजनिक अनुबंध का हिस्सा है। क्या यह सच है, और इसका क्या अर्थ है? मैंने एक साधारण परीक्षण चलाया और MyLib.dll में पैरामीटर नाम बदलने से MyApp.exe को तोड़ दिया नहीं गया, जिसे मूल नाम के साथ नामित तर्क का उपयोग करके विधि कहा जाता है, मुझे लगता है क्योंकि सी # कंपाइलर ने संकलन समय पर ओवरलोड रिज़ॉल्यूशन किया था, और जेनरेट किया गया था आईएल पैरामीटर नाम के बारे में कुछ नहीं जानता है। यह वही है disassembled कोड परावर्तक पर दिखाई देता है:सी # रनटाइम ब्रेकिंग चेंज में पैरामीटर नाम बदलना है?

private static void Main() 
{ 
    bool CS$0$0000 = true; 
    Class1.DoSomething(CS$0$0000); 
    Console.ReadKey(); 
} 

... और इस मूल स्रोत कोड है:

static void Main() { 

    MyLib.Class1.DoSomething(a: true); 

    Console.ReadKey(); 
} 
+0

हाँ, आप इसे अच्छी तरह से समझ गए हैं, यह तोड़ नहीं रहा है। एक परिदृश्य के साथ आ रहा है जहां यह तोड़ रहा है मुश्किल है, मैं आसानी से देर से बाध्यकारी परिदृश्य के साथ आ सकता हूं जहां यह करता है। –

उत्तर

19

मैंने कुछ लेख पढ़े जो कहते हैं कि सी # 3.0 में नामित तर्कों के परिचय के साथ, पैरामीटर का नाम अब सार्वजनिक अनुबंध का हिस्सा है। क्या यह सच है, और इसका क्या अर्थ है?

यह सच है कि तर्क नाम सार्वजनिक अनुबंध का हिस्सा हैं, लेकिन कथन में दो त्रुटियां हैं।

सबसे स्पष्ट त्रुटि यह है कि नामित तर्क सी # 4.0 में सी # 3.0 में पेश किए गए थे।

लेकिन अधिक सूक्ष्म त्रुटि कहीं अधिक महत्वपूर्ण है। सी # 4.0 में नामित तर्कों का परिचय नहीं था विधि के सार्वजनिक अनुबंध के पैरामीटर के हिस्से का नाम बनाते हैं। पैरामीटर के नाम हमेशा सार्वजनिक अनुबंध के हिस्से थे क्योंकि सी # के अलावा अन्य भाषाओं में नामांकित तर्क थे। विशेष रूप से, वीबी ने हमेशा नामों का समर्थन किया है।

इसलिए पुस्तकालय में पैरामीटर का नाम बदलना हमेशा वीबी पुनर्मूल्यांकन के लिए एक तोड़ने वाला परिवर्तन था। अब यह सी # पुनर्मूल्यांकन के लिए एक तोड़ने वाला बदलाव भी है, लेकिन इसका मतलब यह नहीं है कि यह पहले से सुरक्षित था और अब यह खतरनाक है। यह हमेशा खतरनाक था।

सी # एकमात्र .NET भाषा नहीं है, दूर तक नहीं। जब आप किसी प्रकार की सार्वजनिक रूप से दिखाई देने वाली सतह का हिस्सा बदलते हैं, तो आप प्रत्येक भाषा में प्रोग्राम तोड़ने का जोखिम उठाते हैं। सी # विशेषता है या नहीं है उस तथ्य को बदल नहीं है।

11

समस्या है, कहते हैं कि तुम है तो तरह एक सार्वजनिक एपीआई:

public void Foo(bool a = false) 
{ 
    //.... 

फोन करने वाले यह का उपयोग करता है, तो जैसे एक आवेदन लिख सकते हैं:

Foo(a: true); 

आप तो विधि को परिवर्तित करते हैं:

public void Foo(bool aBetterName = false) 
{ 
    //.... 

अब, अचानक, फोन करने वाले का कोड अब संकलन होगा संकलक के रूप में, (जैसे ही वे अपने नए पुस्तकालय के लिए अद्यतन के रूप में) नहीं रह देखेंगे a नामक एक पैरामीटर।

+0

स्पॉट ऑन और क्रिस्टल स्पष्ट। –

+1

पर रॉक हां, मैं समझता हूं कि यह एक संकलन तोड़ने वाला परिवर्तन है। –

+0

@ मैक्सटोरो: इसका मतलब यह है। सार्वजनिक अनुबंध तय किया गया है, क्योंकि आप अन्य कॉलर्स (संकलन समय पर) तोड़ देंगे। यह रनटाइम ब्रेकिंग चेंज नहीं है, हालांकि (पैरामीटर जोड़ने की तरह) होगा, क्योंकि प्रतिस्थापन सभी संकलन समय पर संभाला जाता है। ध्यान दें कि डिफ़ॉल्ट को बदलना, हालांकि, अन्य कॉलर को अद्यतन करने का कारण नहीं बनता है, क्योंकि यह सब संकलन समय पर संभाला जाता है। (वैकल्पिक/नामांकित तर्क पूरी तरह से संकलित समय चाल हैं) –

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