2009-09-02 12 views
67

मान लीजिए मैं:सी # में एक 'बाहर' पैरामीटर के रूप में एक संपत्ति पासिंग

public class Bob 
{ 
    public int Value { get; set; } 
} 

मैं

Int32.TryParse("123", out bob.Value); 

की तरह एक बाहर पैरामीटर के रूप में मूल्य सदस्य पास करना चाहते हैं लेकिन मैं एक मिल संकलन त्रुटि, "'आउट' तर्क को चर के रूप में वर्गीकृत नहीं किया गया है।" वहाँ किसी भी तरह से इस लक्ष्य को हासिल करने के लिए है, या मैं एक चर को निकालने के लिए जा रहा हूँ, ए ला:

int value; 
Int32.TryParse("123", out value); 
bob.Value = value; 
+0

संभावित डुप्लिकेट [क्या गुणों को "आउट" या "रेफरी" पैरामीटर के रूप में पास करना संभव है?] (Http://stackoverflow.com/questions/564557/is-it-possible-to-pass-properties-as -out-or-ref-पैरामीटर) – nawfal

उत्तर

75

आप स्पष्ट रूप से एक स्वत: लागू किया के बजाय एक क्षेत्र और "सामान्य" संपत्ति का उपयोग करना होगा संपत्ति:

public class Bob 
{ 
    private int value; 
    public int Value 
    { 
     get { return value; } 
     set { this.value = value; } 
    } 
} 

तो फिर तुम एक बाहर पैरामीटर के रूप में क्षेत्र पारित कर सकते हैं:

Int32.TryParse("123", out bob.value); 

लेकिन निश्चित रूप से, यह है कि केवल के भीतर काम करेंगे एक ही कक्षा, क्योंकि क्षेत्र निजी है (और होना चाहिए!)।

गुण सिर्फ आपको ऐसा करने नहीं देते हैं। यहां तक ​​कि वीबी में भी जहां आप संदर्भ द्वारा किसी संपत्ति को पास कर सकते हैं या इसे आउट पैरामीटर के रूप में उपयोग कर सकते हैं, मूल रूप से एक अतिरिक्त अस्थायी चर है।

आप TryParse की वापसी मूल्य के बारे में परवाह नहीं है, तो आप हमेशा अपने स्वयं के सहायक विधि लिख सकते हैं:

static int ParseOrDefault(string text) 
{ 
    int tmp; 
    int.TryParse(text, out tmp); 
    return tmp; 
} 

तब का उपयोग करें:

bob.Value = Int32Helper.ParseOrDefault("123"); 

इस तरह आप एक भी उपयोग कर सकते हैं अस्थायी चर भले ही आपको इसे कई स्थानों पर करने की आवश्यकता हो।

+1

मुझे लगता है कि पहले दृष्टिकोण के साथ समस्या यह है कि यदि आप सीधे क्षेत्र (संपत्ति के बजाय) का उपयोग करते हैं, तो हो सकता है कि आप सत्यापन नियमों को छोड़कर हो सकते हैं जो –

+0

@Dreas: यह पहले से एक स्वत: पूरक संपत्ति है, इसमें संभवतः कोई सत्यापन नियम नहीं हो सकता है ... –

+3

@ जोन: मुझे लगता है कि आप int.Parse को intse.rarse में बदलना चाहते हैं। ParseOrDefault उदाहरण में। – shahkalpesh

4

आप इसे प्राप्त कर सकते हैं, लेकिन संपत्ति के साथ नहीं।

public class Bob { 
    public int Value { get; set; } // This is a property 

    public int AnotherValue; // This is a field 
} 

आप Value पर out उपयोग नहीं कर सकते, लेकिन आप AnotherValue पर कर सकते हैं।

यह

Int32.TryParse("123", out bob.AnotherValue); 

काम करेंगे लेकिन, आम दिशा निर्देशों एक वर्ग क्षेत्र को सार्वजनिक नहीं करना बताता है। तो आपको अस्थायी परिवर्तनीय दृष्टिकोण का उपयोग करना चाहिए।

+0

ओह हाँ * फ़ील्ड *, मैंने गलत शब्द का उपयोग किया। –

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