2010-05-02 15 views
7

के साथ ओवरलोड नरक से बचें मैं सी # 4.0 का उपयोग कर रहा हूं, मैं कई समान तरीकों को लिखने की समस्या से कैसे बच सकता हूं क्योंकि वे प्रत्येक पैरामीटर-अद्वितीय हैं (नई पैरामीटर विशेषताएं कैसे ओवरलोड नरक से बच सकती हैं?)।सी # 4.0

धन्यवाद

उत्तर

13
इसके बजाय इस बात का

:

void Method(string param1, string param2) { } 
void Method(string param1, string param2, string param3) { } 
void Method(string param1, string param2, string param3, string param4) { } 
void Method(string param1, string param2, string param3, int int4) { } 
//etc... 

तुम बस सब पैरामीटर आप चाहते हैं के साथ एक विधि हो सकता है, और इस तरह नामित पैरामीटर का उपयोग कर इसे कहते:

void Method(string param1, string param2 = "default2", 
      string param3 = "default3", int int4 = 12, int lastParam = 12) { } 

और इसे इस तरह कहते हैं:

Method(param1: "myString", int4: 23); 
//or... 
Method(param1: "myString", param4: "string2", int4: 23); 

बस जो आप सेट करना चाहते हैं उसे शामिल करें, शेष विधि हस्ताक्षर में निर्दिष्ट डिफ़ॉल्ट होंगे।

+1

मुझे लगता है कि वाक्यविन्यास में ब्रेसिज़ नहीं हैं। –

+1

@ मार्टिन्हो - वूप्स एक ही समय में जावास्क्रिप्ट ऑब्जेक्ट प्रश्न का उत्तर दे रहे थे :) निश्चित –

+0

क्या होगा यदि विधि सभी मानकों का उपयोग करती है और मैं केवल उनमें से कुछ को पास करने का प्रयास करता हूं? – dotnetdev

6

मान लें कि आपके पास नीचे वर्णित एक वर्ग कर्मचारी है जिसमें 3 रचनाकार हैं।

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Qualification { get; set; } 
    public string MiddleName { get; set; } 

    public Employee(string firstName, string lastName) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= "N/A"; 
     MiddleName= string.Empty; 
    } 
    public Employee(string firstName, string lastName, string qualification) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName= string.Empty; 

    } 
    public Employee(string firstName, string lastName, string qualification, 
     string middleName) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName= middleName 
    } 
} 

सी # 4.0 के साथ, आपको एक ही कन्स्ट्रक्टर बनाने की आवश्यकता होगी जो सभी 3 रचनाकारों को प्रतिस्थापित करेगी।

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Qualification { get; set; } 
    public string MiddleName { get; set; } 

    public Employee(string firstName, string lastName, 
      string qualification = "N/A", string middleName = "") 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName = middleName; 
    } 
} 

यह निर्माता निम्नलिखित शिष्टाचार में कहा जा सकता है ..

Employee emp = new Employee("Adil", "Mughal"); 
Employee emp = new Employee("Adil", "Mughal", middleName: "Ahmed"); 
Employee emp = new Employee("Adil", qualification:"BS"); 
Employee emp = new Employee("ABC", lastName: "EFG", qualification: "BS"); 
Employee emp = new Employee("XYZ", middleName: "MNO"); 
+1

रचनाकारों के विपरीत विधियों के साथ इसे दिखाने के लिए बेहतर है, क्योंकि आप पहले से ही सी # 3. –

+0

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

+0

सी # 3 में मैंने पैरामीटर संग्रह ऑब्जेक्ट को स्वीकार करने के लिए विधि को फिर से लिखना माना होगा। निक टिप्पणी की तरह, आप उस ऑब्जेक्ट को आसानी से संपत्ति प्रारंभकर्ताओं का उपयोग करके प्रारंभ कर सकते हैं। लेकिन सी # 4.0 के लिए सीधे विधि में वैकल्पिक तर्कों का उपयोग करना बहुत अधिक समझदार लगता है। – Joren