2010-06-29 15 views
6

के रूप में विधि पैरामीटर डिफ़ॉल्ट मान सरणी के रूप में सी # 4.0 विधि डिफ़ॉल्ट मान पैरामीटर में संभव है (पूर्व स्ट्रिंग [] sArray के लिए)? यदि हां, तो इसे कैसे कार्यान्वित करें?सी # 4.0: सरणी

मैंने कोशिश की नीचे की तरह कॉल समारोह:

MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 

यह

उत्तर

10

जैसा कि अन्य ने कहा है, डिफ़ॉल्ट मान सरणी नहीं हो सकते हैं।

public void Foo(int[] x = null) 
{ 
    x = x ?? new int[] { 5, 10 }; 
} 

या आप सरणी उत्परिवर्तित या कॉलर को बेनकाब करने के लिए नहीं जा रहे हैं:

हालांकि, इस से बचने का एक ही रास्ता डिफ़ॉल्ट मान अशक्त बनाने के लिए और फिर सरणी यदि आवश्यक हो तो प्रारंभ है
private static readonly int[] FooDefault = new int[] { 5, 10 }; 
public void Foo(int[] x = null) 
{ 
    x = x ?? FooDefault; 
} 

ध्यान दें कि यह मानता है कि null कोई मान नहीं है जिसे आप किसी भी अन्य कारण से उपयोग करना चाहते हैं। यह एक वैश्विक रूप से लागू विचार नहीं है, लेकिन यह कुछ मामलों में अच्छी तरह से काम करता है जहां आप संकलन-समय निरंतर के रूप में डिफ़ॉल्ट मान व्यक्त नहीं कर सकते हैं। आप एक ही चीज का उपयोग Encoding.UTF8 जैसे डिफ़ॉल्ट एन्कोडिंग के रूप में कर सकते हैं।

यदि आप एक मान प्रकार पैरामीटर चाहते हैं, तो आप इसे एक शून्य बना सकते हैं। उदाहरण के लिए, आप प्रोसेसर की संख्या के लिए एक पैरामीटर डिफ़ॉल्ट (जो स्पष्ट रूप से एक संकलन समय स्थिर नहीं है) तुम कर सकते हो चाहता था लगता है:

public void RunInParallel(int? cores = null) 
{ 
    int realCores = cores ?? Environment.ProcessorCount; 
} 
3

डिफ़ॉल्ट मान काम नहीं कर रहा है संकलन समय निरंतर, जिसका अर्थ है सरणियों नहीं किया जा सकता होना चाहिए।

मानक (पृष्ठ 312) का कहना है यह:

  • एक निरंतर अभिव्यक्ति
  • की अभिव्यक्ति:

    एक डिफ़ॉल्ट तर्क में अभिव्यक्ति निम्न में से एक होना चाहिए फॉर्म नया एस() जहां एस एक मान प्रकार

  • फॉर्म डिफ़ॉल्ट (एस) की एक अभिव्यक्ति है जहां एस एक मान प्रकार
है
+0

ओह वाह कि भयानक है। यह गुणों के समान ही मुद्दा है, सिवाय इसके कि मुझे पूरा यकीन है कि आप वास्तव में उनके लिए सरणी का उपयोग कर सकते हैं। आप प्रारंभिक सरणी क्यों घोषित नहीं कर सकते? वे स्थिर हैं –

+1

@Graphain: एक खाली एक स्थिर के अलावा किसी भी सरणी में किस तरह से है? गैर खाली सरणी हमेशा mutable हैं। कुछ कॉल (जैसे बुलाया गया तरीका) सामग्री में बदल गया था, तो संकलक प्रत्येक कॉल पर सरणी की एक प्रति बनाना होगा। –

+0

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