سؤال

سؤال بسيط، نأمل إجابة بسيطة:

أود القيام بما يلي:

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. أريد الحصول على هذا المتغير كسلسلة، ولكن قم بتعيينه باستخدام شيء من النوع X.

هل هذا ممكن؟

--تعديل--

لقد أدركت أنني أستطيع أن أفعل شيئا مثل:

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 بدلا من "سلسلة" كما نوع "الحصول عليه". إذا كنت ترغب في استخدام "DateTimeProperty" آخر حيث في التعليمات البرمجية الخاصة بي، يجب أن ألقي ذلك.

هل كانت مفيدة؟

المحلول

لا، يمكنك إضافة. يمكنك إضافة .tosting () في رمز الاتصال، لكن لا يمكنك أن تفعل ما تقترحه دون أسماء مختلفة مثل هذا:

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 هو ل بشكل ضمني, ، ترجمة الوقت مكتوبة فارiables، لا متحرك المتغيرات.

بالتااكيد لا افعل ما لاحظته في تحريرك. قدمت استراحة في الاتفاقية، آثار الأداء المحتملة (وإن كان طفيفا) ومشاكل توطينية كبيرة.

نصائح أخرى

كممتلكات، لا هذا غير ممكن. يمكنك إجراء طرق الحصول على أنواع مختلفة، ولكن بالنسبة إلى خاصية يجب أن تكون الأنواع هي نفسها.

تعديل:

في حين:

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;
}

ليس بهذه الطريقة، ولكن يمكنك بالتأكيد الحصول على خاصية ثانية تصل إلى حقل M_INTERNADERTIME.

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

ربما هذا يساعد

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;
}

الإجابة البسيطة لا، إلى الرمز الخارجي الخاص بك سيتصرف الخاص بممتلكاتك بالطريقة الدقيقة التي ستحصل عليها الحقل، لا يمكنك الحصول على عقار لديه أنواع مختلفة / الحصول على أنواع مختلفة تماما كما لا يمكن ضبطه بنوع وعندما تكون طلب انها قيمة الحصول على نوع مختلف مرة أخرى.

ماذا عن:

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);           
      } 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top