2008-11-07 14 views
29

पर शून्य तर्कों को पास करना क्या सी # विधियों के लिए शून्य तर्कों को पास करने का कोई तरीका है (सी ++ में शून्य तर्कों की तरह कुछ)?सी # विधियों

उदाहरण के लिए:

private void Example(int* arg1, int* arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 

उत्तर

68

हां। .NET: संदर्भ प्रकारों और मान प्रकारों में दो प्रकार के प्रकार हैं।

संदर्भ प्रकार (आमतौर पर कक्षाएं) हमेशा संदर्भों द्वारा संदर्भित होते हैं, इसलिए वे बिना किसी अतिरिक्त काम के शून्य का समर्थन करते हैं। इसका अर्थ यह है कि यदि एक चर का प्रकार एक संदर्भ प्रकार है, तो चर स्वचालित रूप से एक संदर्भ है।

डिफ़ॉल्ट रूप से मूल्य प्रकार (उदा। Int) में शून्य की अवधारणा नहीं है। हालांकि, उनके लिए एक रैपर है जिसे न्यूलबल कहा जाता है। यह आपको गैर-शून्य मूल्य प्रकार को समाहित करने और शून्य जानकारी शामिल करने में सक्षम बनाता है।

हालांकि उपयोग थोड़ा अलग है।

// Both of these types mean the same thing, the ? is just C# shorthand. 
private void Example(int? arg1, Nullable<int> arg2) 
{ 
    if (arg1.HasValue) 
     DoSomething(); 

    arg1 = null; // Valid. 
    arg1 = 123; // Also valid. 

    DoSomethingWithInt(arg1); // NOT valid! 
    DoSomethingWithInt(arg1.Value); // Valid. 
} 
+0

तुम कृपया मुझे फर्क बता सकते हैं/'w निजी शून्य उदाहरण (पूर्णांक? ARG1) ख' और 'निजी शून्य उदाहरण (पूर्णांक? ARG1 = 0)' – Unbreakable

3

सी # 2.0 से::

private void Example(int? arg1, int? arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 
4

आप पूर्णांक की तरह NullableValueTypes उपयोग कर सकते हैं (

यह सी # विधि के लिए निम्न C++ समारोह अनुवाद करने के लिए संभव है?) इसके लिए। कोड इस तरह होगा:

private void Example(int? arg1, int? arg2) 
{ 
    if(!arg1.HasValue) 
    { 
     //do something 
    } 
    if(!arg2.HasValue) 
    { 
     //do something else 
    } 
} 
3

सी # 2.0 से शुरू, आप व्यर्थ सामान्य Nullable प्रकार उपयोग कर सकते हैं, और सी # में एक आशुलिपि संकेतन प्रकार के द्वारा पीछा किया है?

उदा।

private void Example(int? arg1, int? arg2) 
{ 
    if(arg1 == null) 
    { 
     //do something 
    } 
    if(arg2 == null) 
    { 
     //do something else 
    } 
} 
5

मुझे लगता है कि int* के सबसे नजदीक सी बराबर # ref int? होगा। क्योंकि ref int? बुलाए गए विधि को कॉलिंग विधि पर वापस मानने की अनुमति देता है।

int*

  • अशक्त हो सकता है।
  • गैर-शून्य हो सकता है और एक पूर्णांक मान को इंगित कर सकता है।
  • यदि शून्य नहीं है, तो मूल्य बदल दिया जा सकता है, और परिवर्तन कॉलर को प्रचारित करता है।
  • शून्य पर सेट करने के लिए कॉलर पर वापस नहीं भेजा गया है।

ref int?

  • अशक्त हो सकता है।
  • एक पूर्णांक मान हो सकता है।
  • मूल्य हमेशा बदला जा सकता है, और परिवर्तन कॉलर को प्रचारित करता है।
  • मूल्य शून्य पर सेट किया जा सकता है, और यह परिवर्तन कॉलर पर भी प्रचारित होगा।
2

ओपी के सवाल अच्छी तरह से पहले से ही उत्तर है, लेकिन शीर्षक मैं इसे निम्नलिखित प्राइमर से लाभ लगता है कि पर्याप्त सिर्फ व्यापक है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace consolePlay 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program.test(new DateTime()); 
      Program.test(null); 
      //Program.test(); // <<< Error. 
      // "No overload for method 'test' takes 0 arguments" 
      // So don't mistake nullable to be optional. 

      Console.WriteLine("Done. Return to quit"); 
      Console.Read(); 
     } 

     static public void test(DateTime? dteIn) 
     { 
      Console.WriteLine("#" + dteIn.ToString() + "#"); 
     } 
    } 
} 

उत्पादन:

#1/1/0001 12:00:00 AM# 
## 
Done. Return to quit 
0

आप उपयोग कर सकते हैं 2 तरीके: int? या शून्य, दोनों एक ही व्यवहार है। आप समस्याओं के बिना मिश्रण कर सकते हैं लेकिन कोड को साफ करने के लिए बेहतर विकल्प है।

विकल्प 1 (के साथ?):

private void Example(int? arg1, int? arg2) 
    { 
     if (arg1.HasValue) 
     { 
      //do something 
     } 
     if (arg1.HasValue) 
     { 
      //do something else 
     } 
    } 

विकल्प 2 (Nullable के साथ):

private void Example(Nullable<int> arg1, Nullable<int> arg2) 
    { 
     if (arg1.HasValue) 
     { 
      //do something 
     } 
     if (arg1.HasValue) 
     { 
      //do something else 
     } 
    } 

सी # 4.0 से इस में, अधिक लचीलेपन के साथ भी ऐसा ही करने का एक नया तरीका आता है यदि ढांचा optional parameters with default values प्रदान करता है, तो इस तरीके से यदि आप सभी पैरामीटर के बिना विधि को कॉल करते हैं तो आप डिफ़ॉल्ट मान सेट कर सकते हैं।

विकल्प 3 (मूलभूत मूल्यों के साथ)

private void Example(int arg1 = 0, int arg2 = 1) 
    { 
     //do something else 
    } 
संबंधित मुद्दे