2012-12-11 34 views
31

क्या कोई यह बताने की परवाह करेगा कि यह कोड फोल्डिंग आउटपुट कैसे उत्पन्न करता है? वैकल्पिक पैरामीटर के साथविधि ओवरराइडिंग और वैकल्पिक पैरामीटर

using System; 

namespace ConsoleApplication1 
{ 
    class Test 
    { 
     public override string ToString() { return "ToString override"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Test2 
    { 
     public new string ToString() { return "ToString new"; } 
     public string ToString(string optional = "") 
      { return String.Format("ToString with optional parameter {0}", optional); } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test one = new Test(); 
      Test2 two = new Test2(); 
      Console.WriteLine(one); 
      Console.WriteLine(one.ToString()); 
      Console.WriteLine(one.ToString("foo")); 
      Console.WriteLine("--"); 
      Console.WriteLine(two); 
      Console.WriteLine(two.ToString()); 
      Console.WriteLine(two.ToString("bar")); 
      Console.ReadKey(); 
     } 
    } 
} 

ToString ओवरराइड

ToString

वैकल्पिक पैरामीटर foo साथ ToString

-

ConsoleApplication1.Test2

वैकल्पिक पैरामीटर पट्टी के साथ नई

ToString toString

+3

आप कौन सी रेखा समझ में नहीं आती? (उन सभी के बारे में विस्तार से जाना मुश्किल होगा।) –

+0

मूल रूप से कैसे संकलक विभिन्न तरीकों के बीच चुनता है, क्योंकि उनके समान हस्ताक्षर होते हैं। – pneuma08

+1

उनके पास समान हस्ताक्षर नहीं हैं ... और फिर, यदि आप कहेंगे कि * कौन सी रेखाएं आप फंस गए हैं तो इससे मदद मिलेगी। आपने यह समझने की कोशिश की है कि ओवरलोड रिज़ॉल्यूशन कैसे काम करता है? वैसे, सी # 4.5 जैसी कोई चीज़ नहीं है। –

उत्तर

49

ठीक है, वहाँ के रूप में सामान्य ब्याज, यहाँ एक त्वरित संस्करण है:

Console.WriteLine (एक)

यह WriteLine(object) का उपयोग करेगा ओवरलोड, जो बदले में object.ToString() आभासी विधि निष्पादित करेगा, One में ओवरराइड किया गया था - इसलिए ToString override

का आउटपुट

Console.WriteLine (one.ToString())

यह One देख कर आपको जो तरीकों नव घोषित तरीकों होगा - छूट ओवरराइड। बिल्कुल एक ऐसी विधि है जो लागू है - वैकल्पिक पैरामीटर वाला एक। इसलिए इसे डिफ़ॉल्ट मान का उपयोग करके निष्पादित किया जाता है, जिससे ToString with optional parameter का उत्पादन होता है।

Console.WriteLine (one.ToString ("foo"))

एक ही फिर से, लेकिन इस बार संकलक डिफ़ॉल्ट मान का उपयोग करने की आवश्यकता नहीं है, इसलिए ToString with optional parameter foo

कंसोल। WriteLine (दो)

फिर से, यह वर्चुअल object.ToString() विधि WriteLine(object) से कॉल करेगा। विधि को ओवरराइड नहीं किया गया है, इसलिए प्रकार के नाम को वापस करने वाले डिफ़ॉल्ट कार्यान्वयन का उपयोग किया जाता है, जिससे ConsoleApplication1.Test2 का उत्पादन होता है।

Console.WriteLine (two.ToString())

संकलक सभी विधि Two में घोषित पर लग रहा है जो नहीं अधिभावी आभासी तरीके हैं। इस मामले में, दो ऐसी विधियां हैं - पैरामीटर रहित और वैकल्पिक पैरामीटर वाला एक। पैरामीटर रहित एक शामिल है क्योंकि यह बेस क्लास विधि को ओवरराइड करने के बजाय नया है।

पैरामीटर रहित विधि को "बेहतर" उम्मीदवार समझा जाता है क्योंकि संकलक एक विधि को कॉल करना पसंद करता है जिसमें किसी भी वैकल्पिक पैरामीटर को भरने की आवश्यकता नहीं होती है।इसलिए उत्पादन ToString new

Console.WriteLine (two.ToString ("बार"))

फिर, संकलक सभी विधि Two जो में घोषित पर ध्यान देती है अधिभावी आभासी तरीकों नहीं हैं। इस मामले में, ऐसी दो विधियां हैं - लेकिन पैरामीटर रहित लागू नहीं है, केवल वैकल्पिक पैरामीटर के साथ ही छोड़कर। के रूप में यह एक तर्क वैसे भी मिला है संकलक, उपयोग यहाँ वैकल्पिक पैरामीटर का डिफ़ॉल्ट मान की जरूरत नहीं है ... इसलिए उत्पादन ToString with optional parameter bar

इस पर और अधिक के लिए है, सी # भाषा विनिर्देश पढ़ें - या आधे रास्ते के घर के लिए, मेरे article on overloading देखें।

+3

वास्तव में कठिन, लेकिन जानकारीपूर्ण, उन्हें लिखने के लिए धन्यवाद –

+0

अच्छी चीजें जॉन (सामान्य के रूप में)। मैं धीरे-धीरे इसे काम करने के लिए गोल कर रहा था। मुख्य संभावित आश्चर्य बिंदु यह है कि यह 'ऑब्जेक्ट.ToString() 'का उपयोग करता है और ऑब्जेक्ट पर' ToString' नहीं है और तथ्य यह है कि यह विरासत में नए परिभाषित तरीकों को पसंद करता है। – Chris

+71

गुड गाय जॉन स्कीट: कहते हैं, "उन सभी के बारे में विस्तार से जाना मुश्किल होगा", उन सभी के बारे में विस्तार से बताया जाता है। – Rawling