2009-06-09 12 views
15

सरल सवाल है, उम्मीद है कि एक साधारण जवाब:विभिन्न सेट के साथ एक्सेसर और प्रकार प्राप्त करें?

मैं निम्न कार्य करना चाहते हैं:

private DateTime m_internalDateTime; 
public var DateTimeProperty 
{ 
    get { return m_internalDateTime.ToString(); } // Return a string 
    set { m_internalDateTime = value; } // here value is of type DateTime 
} 

ऊपर सिर्फ मैं क्या कर रहा हूँ का एक उदाहरण है। मैं टाइप एक्स के आंतरिक चर के लिए एक सार्वजनिक एक्सेसर रखना चाहता हूं। मैं चाहता हूं कि उस चर को एक स्ट्रिंग के रूप में प्राप्त करें, लेकिन इसे किसी प्रकार के x का उपयोग करके सेट करें।

क्या यह संभव है?

--edit--

मैं सिर्फ मैं की तरह कुछ करना व्यक्ति बना सकता है:

private DateTime m_internalDateTime; 
public object DateTimeProperty 
{ 
    get { return m_internalDateTime.ToString(); } // Return a string 
    set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime 
} 

लेकिन फिर भी, कहते हैं कि मैं एक "स्ट्रिंग" के y बजाय प्रकार का उपयोग अपने 'के लिए' प्रकार के रूप में करते हैं । अगर मैं "डेटटाइमप्रोपर्टी" का उपयोग करना चाहता हूं, जहां मेरे कोड में, मुझे इसे डालना होगा।

+1

मैं दृढ़ता से आप अपने संपादन में कोड का उपयोग नहीं प्रोत्साहित करते हैं। सम्मेलन से एक अजीब तोड़ने के अलावा, इसमें थोड़ा प्रदर्शन और गंभीर स्थानीयकरण के मुद्दे हो सकते हैं। –

+8

क्या आप उस कोड को लिखने की हिम्मत नहीं करते हैं। – mquander

उत्तर

8

नहीं। आप स्पष्ट रूप से बुला कोड में .ToString() जोड़ सकते हैं, लेकिन आप क्या आप इस तरह अलग-अलग नाम के बिना प्रस्ताव नहीं कर सकता:

private DateTime m_internalDateTime; 
public DateTime SetDateTime { set { m_internalDateTime = value; } } 
public string GetDateTime { get { return m_internalDateTime.ToString(); } } 

या, यहां तक ​​कि बेहतर गुण के बजाय उपयोग तरीकों (टिप्पणी में नोट):

private DateTime m_internalDateTime; 
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; } 
public string GetDateTime() { return m_internalDateTime.ToString(); } 

ध्यान रखें कि varपरोक्ष के लिए है, संकलन समय आपके द्वारा लिखा गया var iables, गतिशील चर नहीं।

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

+9

यदि आप GetDateTime और SetDateTime का उपयोग करने जा रहे हैं, तो वे वास्तव में गुणों के बजाय विधियां होनी चाहिए। –

+0

क्या मैं पूछ सकता हूं कि कोई गुणों के बजाय इन तरीकों को क्यों बनायेगा? – Nick

+8

@ निक: क्योंकि विधियां क्रियाओं की तरह हैं जो ऑब्जेक्ट और गुणों के लिए कुछ करती हैं, वे संज्ञाओं के बारे में कुछ कहती हैं। SetDateTime और GetDateTime क्रियाएं हैं, इसलिए विधियां होनी चाहिए। –

5

एक संपत्ति के रूप में, यह संभव नहीं है। आप अलग-अलग प्रकार के होते हैं और सेट विधियां बना सकते हैं, लेकिन किसी संपत्ति के लिए प्रकार समान होना चाहिए।

संपादित करें:

जबकि:

private DateTime m_internalDateTime; 
public object DateTimeProperty 
{ 
    get { return m_internalDateTime.ToString(); } // Return a string 
    set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime 
} 

वाक्य रचना सही है, संकलन होगा और आप इनपुट के रूप में दिनांक समय स्वीकार करते हैं और एक तार वापस जाने के लिए अनुमति देता है, यह नहीं एक अच्छी योजना होगी। यह काम करता है, लेकिन यह आपको और किसी को भी इस कोड तक पहुंचने के लिए बनाता है, अनियंत्रित सत्यापन करता है। इसके अतिरिक्त, यह भविष्य में किसी अन्य डेवलपर के लिए कमजोर है, ज्ञात नियमों को जानना या महसूस करना, जिसके लिए आपने संकलन समय सुरक्षा खो दी है। इसके अतिरिक्त, दृढ़ता से टाइप किए गए तरीके से, दो गुणों को बनाने के लिए शायद ही कोई और कोड, या एक ही लक्ष्य को पूरा करने वाले दो विधियां।

व्यक्तिगत रूप से, मैं दो तरीकों का उपयोग करने की सिफारिश करता हूं (जेफ येट्स को एक अच्छी व्याख्या के लिए टिप्पणी क्यों देखें)।

private DateTime m_internalDateTime; 
public string GetDateTime() 
{ 
    return m_internalDateTime.ToString(); 
} 

public void SetDateTime(DateTime dateTime) 
{ 
    m_internalDateTime = dateTime; 
} 
3

इस तरह से नहीं, लेकिन आप निश्चित रूप से एक दूसरी संपत्ति हो सकते हैं जो m_internalDateTime फ़ील्ड तक पहुंचता है।

public string DateTimeString 
{ 
    get { return m_internalDateTime.ToString(); } 
} 
0

सरल उत्तर संख्या, आपके बाहरी कोड पर आपकी संपत्ति सही तरीके से व्यवहार करेगी, एक फ़ील्ड होगी, आपके पास अलग-अलग सेट/प्राप्त प्रकार होने वाली संपत्ति नहीं हो सकती है, जैसे कि आप दायर नहीं कर सकते थे टाइप करें और जब आप इसका मान लें तो एक अलग प्रकार वापस प्राप्त करें।

0

तरीके के बारे में:

private DateTime intDT; 
public string DateTimeProperty 
{ 
     get { return intDT.ToString(); } // Return a string 
     set 
     { 
     DateTime dt; 
     if (DateTime.TryParse(value, out dt)) 
      intDT = dt; 
     else throw new ArgumentException(string.Format(
      "{0} cannot be converted to a DateTime.", value);   
     } 
} 
3

हो सकता है कि मदद करता है

public class TDecimal 
{ 
    private decimal? m_value; 
    public bool HasValue { get { return m_value.HasValue; } } 
    public decimal Value { get { return m_value.Value; } } 

    public static implicit operator TDecimal(string a_value) 
    { 
     decimal d; 
     if (decimal.TryParse(a_value, out d)) 
     { 
      return new TDecimal() {m_value = d}; 
     } 

     return new TDecimal() {m_value = null}; 
    } 

    public static implicit operator decimal(TDecimal a_value) 
    { 
     if(a_value.HasValue) 
     { 
      return a_value.Value; 
     } 

     throw new ArgumentNullException("a_value"); 
    } 
} 

public class A 
{ 
    public TDecimal Prop { get; set; } 
} 


A a = new A(); 

a.Prop = "123"; 
if (a.Prop.HasValue) 
{ 
    decimal d = a.Prop; 
} 
संबंधित मुद्दे