2009-04-14 19 views
8

यह एक विरोधी पैटर्न का थोड़ा सा हो सकता है, लेकिन सी # कक्षा पर एक संपत्ति के लिए कई मूल्यों को स्वीकार करना संभव है?क्या सी # संपत्ति एकाधिक मान स्वीकार कर सकती है?

उदाहरण के लिए, कहें कि मेरे पास एक सार्वजनिक int संपत्ति है और मैं हमेशा इसे एक int वापस करना चाहता हूं, लेकिन मैं दशमलव, एक पूर्णांक या कुछ अन्य डेटा प्रकार निर्दिष्ट करके संपत्ति सेट करने में सक्षम होना चाहता हूं। तो मेरा सवाल यह है कि क्या गुणों के लिए कई मान स्वीकार करना संभव है?

उत्तर

10

मुझे लगता है कि क्या पूछना है मतलब है: कैसे implicit और explicitint और decimal के लिए काम करते कास्टिंग करता है?

आप अंतर्निहित कास्टिंग के बारे में पूछ रहे हैं जो स्वचालित रूप से किसी ऑब्जेक्ट को किसी अन्य परिभाषित प्रकार पर कवर करता है। आप इसे int और decimal के लिए ऐसा करने में सक्षम नहीं होंगे क्योंकि वे पहले ही ढांचे में परिभाषित हैं और आप इसे decimal के दायरे को int पर कास्ट करके कम करने में सक्षम नहीं हैं। लेकिन यदि आप इसे बनाए गए वास्तविक ऑब्जेक्ट्स के उदाहरण के रूप में उपयोग कर रहे थे, तो आप यह कैसे काम करते हैं और इसे कार्यान्वित करने के तरीके के बारे में अधिक जानने के लिए उपरोक्त implicit लिंक का उपयोग कर सकते हैं।

लेकिन आप हमेशा कन्वर्ट विधि का उपयोग सही प्रकार में बदलने के लिए कर सकते हैं;

public int MyProperty { get; set; } 
... 
obj.MyProperty = Convert.ToInt32(32.0M); 
obj.MyProperty = Convert.ToInt32(40.222D); 
obj.MyProperty = Convert.ToInt32("42"); 
+0

मैं एक उदाहरण के रूप में इनट्स और दशमलव का उपयोग कर रहा था लेकिन यह संबंधित है। अनिवार्य रूप से मैं सिर्फ एक ही संपत्ति के लिए कई अलग-अलग प्रकारों को असाइन करने में सक्षम होना चाहता हूं और संपत्ति को वापस लौटने के लिए काम करना चाहता हूं। जैसा कि आप उल्लेख करते हैं, निहित कास्टिंग इस की अनुमति देगा। – lomaxx

+0

एकमात्र अन्य चीज जो मैं जोड़ूंगा वह यह है कि निहित कास्टिंग समस्या को हल करेगी, ऐसा लगता है कि यह पर्याप्त रूप से दायरे को सीमित नहीं करता है। मैं जो करने की कोशिश कर रहा हूं उसके लिए यह ठीक काम करेगा, लेकिन अगर मुझे कभी भी प्रत्येक कलाकार के लिए विशिष्ट नियमों की आवश्यकता होती है तो मैं im (ex) plicit कास्टिंग के साथ संभावित समस्याएं देख सकता हूं। – lomaxx

+0

जो कुछ भी कहा गया है, मुझे अभी भी लगता है कि मैं जो करने की कोशिश कर रहा हूं वह एक विरोधी पैटर्न है और शायद यह बेहतर होगा कि इसे गतिशील भाषा में कर दिया जाए, जहां मैं इसे कुछ भी सौंप सकता हूं, या जो कुछ भी कर रहा हूं उसे पुनर्विचार कर रहा हूं पहली जगह में समस्या से बचने के लिए। – lomaxx

-1

गुण सार्वजनिक क्षेत्रों की तरह दिखने वाले हैं। सेट-विधियों को बनाएं, या संपत्ति-सेटटर के विपरीत असाइनमेंट स्टेटमेंट में कलाकार/रूपांतरण करें।

0

नहीं। एक संपत्ति का एक मूल्य है। आप इसे कुछ भी असाइन कर सकते हैं जिसे एक ही प्रकार के चर के लिए असाइन किया जा सकता है।

+0

यह सच नहीं है, आप इसे किसी ऑब्जेक्ट को असाइन कर सकते हैं जिसे स्पष्ट रूप से डाला जा सकता है। –

+0

@ निक बर्र्डी: यह सटीक नहीं है। एक बार जब आप इसे एक अलग प्रकार में डाल देते हैं, तो आप अलग-अलग प्रकार को आवंटित कर रहे हैं! –

+0

@ जॉन: सहमत, पता नहीं निक क्या धूम्रपान कर रहा है। – Samuel

1

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

2

संपादित करें: के बाद सेशन विशेष रूप से गुण के लिए बाध्य है इस विधि का उपयोग नहीं किया जा सकता है।

मुझे विश्वास नहीं है कि आपके द्वारा वर्णित मजबूती के साथ यह संभव है। इस मामले में आप अधिभारित विधि (बहुरूपता) का उपयोग करके बेहतर हो सकते हैं।

यह आमतौर पर सेटर (या म्यूटेटर) के रूप में जाना जाता है और आप कई अलग-अलग प्रकार के पैरामीटर स्वीकार करने के लिए विधि को अधिभारित कर सकते हैं। यदि आप चाहें तो प्रत्येक अलग-अलग प्रदर्शन करेगा। जिस तरह से मैंने उन्हें स्थापित किया है, वह सिंटैक्टिक रूप से सही नहीं हो सकता है, लेकिन यह सामान्य विचार है जिसे आप ढूंढ रहे हैं।

public class MyClass { 
    private Int32 mySomeValue; 
    public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); } 
    public void setSomeValue(Int32 value) { this.mySomeValue = value; } 
} 
संबंधित मुद्दे