C # में एक प्रॉपर्टी को 'आउट' पैरामीटर के रूप में पास करना


81

मान लीजिए कि मेरे पास है:

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

मैं मान के सदस्य को एक आउट पैरामीटर की तरह पास करना चाहता हूं

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

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

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

जवाबों:


83

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

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

फिर आप फ़ील्ड को आउट पैरामीटर के रूप में पास कर सकते हैं :

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

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

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

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

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

फिर उपयोग करें:

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

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


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

3
@Jon: मुझे लगता है कि आप int.Parse को int में बदलना चाहेंगे। ParseOrDefault उदाहरण में।
शालकेश

8
Btw, यही कारण है कि आपके पास आउटपुट पैरामीटर के रूप में एक संपत्ति नहीं हो सकती है, यदि कोई संपत्ति सेट करना वास्तव में एक फ़ंक्शन कॉल है और यदि आप हुड के नीचे देखते हैं तो कोई असाइनमेंट नहीं है।
डर्क वोल्मार

3
मुझे उचित रेगुलेटरी शुगर देखना पसंद होगा, मुझे एक रेफरी या आउट पैरामीटर के रूप में एक संपत्ति पास करने के लिए। चलिए कंपाइलर का काम करते हैं, यह मुझसे ज्यादा तेज है।
इग्नासियो सोलर गार्सिया

1
@SoMoS: चाहे वह मूल्य प्रकार हो या न हो, मेरी टिप्पणी से कोई फर्क नहीं पड़ता। या तो पैरामीटर के लिए विधि के भीतर एक परिवर्तन तुरंत प्रभाव लेता है, या यह नहीं करता है। यह प्रभावित करता है कि क्या होता है अगर एक अपवाद भी फेंक दिया जाता है।
जॉन स्कीट

7

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

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

    public int AnotherValue; // This is a field
}

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

यह काम करेगा

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.