2010-10-12 11 views
47

क्या मैं सी # में डिफ़ॉल्ट पैरामीटर दे सकता हूं?क्या मैं सी # कार्यों में पैरामीटर या वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट मान दे सकता हूं?

सी में:

void fun(int i = 1) 
{ 
    printf("%d", i); 
} 

हम मानकों को डिफ़ॉल्ट मान दे सकते हैं? क्या यह सी # में संभव है? यदि हां, तो क्या हम ओवरलोडिंग कार्यों से बच सकते हैं?

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

ऐसा इसलिए है क्योंकि हम मानेंगे कि यदि हम एक अतिरिक्त वैकल्पिक मूल्य जोड़ते हैं, तो यदि कई स्थानों पर फ़ंक्शन का उपयोग किया जाता है तो कोई कोड परिवर्तन आवश्यक नहीं होता है।

function Add(int a, int b); 

यह इस तरह का उपयोग कर बुलाया जाएगा:

Add(10, 10); 

लेकिन हम इस तरह एक वैकल्पिक पैरामीटर,

function Add(int a, int b, int c = 0); 

तो संकलक उम्मीद

Add(10, 10, 0); 

जोड़ने वास्तव में हम बुला रहे हैं इस Add(10, 10) की तरह और यह फ़ंक्शन उस कक्षा में उपलब्ध नहीं होगा और रन टाइम अपवाद का कारण बनता है।

यह एक समारोह में एक नया पैरामीटर जोड़ने के दौरान होता है जिसे कई स्थानों द्वारा बुलाया जाता है और मुझे यकीन नहीं है कि यह हर बार होगा। लेकिन मैं आपको समारोह को अधिभारित करने का सुझाव देता हूं।

हमेशा हमें उस विधि को अधिभारित करने की आवश्यकता होती है जिसमें वैकल्पिक पैरामीटर होता है। इसके अलावा यदि आप एक से अधिक वैकल्पिक पैरामीटर वाले फ़ंक्शंस के साथ काम कर रहे हैं, तो पैरामीटर के नाम का उपयोग करके मान को पास करना अच्छा होता है।

function Add(int a, int b, int c = 0); 

इस फ़ंक्शन को निम्न तरीके से कॉल करना हमेशा अच्छा होता है।

Add(10, 20, c:30); 
+1

क्या आपने इसे आजमाया है? –

+1

वह सी ++ है, सी नहीं। – leppie

+0

आप क्या पूछ रहे हैं? .. –

उत्तर

55

है कि वास्तव में कैसे आप इसे सी # में करते हैं, लेकिन सुविधा पहले हाँ .NET 4.0

+2

इसका उपयोग करना संभव है .NET 3.5 –

+0

'विजुअल स्टूडियो 2010 +' में 'multitargeting' सुविधा के साथ 'msbuild' है (https://msdn.microsoft.com/en-us/library/vstudio/ee395432(v= vs.100) .aspx)। यह ओवरलोडेड विधियों के समूह में अपने वैकल्पिक पैरा बनाने के लिए '.NET 4.0' के लिए लक्ष्य पैक का उपयोग कर सकता है। – dbardakov

+0

इनलाइन विधियों (Func, action, प्रतिनिधि) के बारे में क्या? – EricG

5

में जोड़ा गया है, लेकिन आप इस प्राप्त करने के लिए .NET 3.5 और # 4.0 सी का उपयोग करने की आवश्यकता होगी कार्यक्षमता।

This MSDN page अधिक जानकारी है।

26

हां। Named and Optional Arguments देखें। ध्यान दें कि डिफ़ॉल्ट मूल्य स्थिर होने की जरूरत है, तो यह ठीक है:

public string Foo(string myParam = "default value") // constant, OK 
{ 
} 

लेकिन यह नहीं है:

public void Bar(string myParam = Foo()) // not a constant, not OK 
{ 
} 
0

यह सी # 4.0 की एक विशेषता है, लेकिन समारोह का उपयोग किए बिना संभव नहीं था उस संस्करण से पहले अधिभार।

26

यह केवल सी # 4 के रूप में संभव है।0

हालांकि, जब तुम सी # का एक संस्करण, 4.0 से पहले का उपयोग करें, तो आप इस के आसपास अतिभारित तरीकों का उपयोग करके काम कर सकते हैं:

public void Func(int i, int j) 
{ 
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j)); 
} 

public void Func(int i) 
{ 
    Func (i, 4); 
} 

public void Func() 
{ 
    Func (5); 
} 

(या, आप offcourse सी # 4.0 में अपग्रेड कर सकते हैं)।

1

यह कार्यक्षमता सी # 4.0 से उपलब्ध है - इसे विजुअल स्टूडियो 2010 में पेश किया गया था। और आप इसे .NET 3.5 के लिए प्रोजेक्ट में उपयोग कर सकते हैं। इसलिए .NET 3.5 से .NET 4.0 में पुरानी परियोजनाओं को अपग्रेड करने की कोई आवश्यकता नहीं है।

आप

This MSDN page वैकल्पिक पैरामीटर के बारे में अधिक जानकारी नहीं है सिर्फ विजुअल स्टूडियो 2010 उपयोग करने के लिए है, लेकिन याद रखें कि यह भाषा संस्करण डिफ़ॉल्ट संकलन चाहिए (परियोजना गुण> Buid-> उन्नत में सेट ...) वीएस 2010 में।

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