أفضل طريقة لاستخدام خاصية للإشارة إلى زوج المفتاح والقيمة في القاموس [مغلق]

StackOverflow https://stackoverflow.com/questions/44100

سؤال

هذه مسألة تافهة إلى حد ما، لكني أشعر بالفضول لسماع آراء الناس حولها.

إذا كان لدي قاموس يمكنني الوصول إليه من خلال الخصائص، أي من هذه التنسيقات تفضل للخاصية؟

/// <summary>
/// This class's FirstProperty property
/// </summary>
[DefaultValue("myValue")]
public string FirstProperty {
    get {
        return Dictionary["myKey"];
    }
    set {
        Dictionary["myKey"] = value;
    }

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

/// <summary>
/// This class's SecondProperty property
/// </summary>
[DefaultValue("myValue")]
private const string DICT_MYKEY = "myKey"
public string SecondProperty {
    get {
        return Dictionary[DICT_MYKEY];
    }
    set {
        Dictionary[DICT_MYKEY] = value;
    }

وهو أكثر تعقيدًا إلى حد ما، ولكن يبدو أنه يوفر أمانًا إضافيًا، وهو أقرب إلى ما أعتقد أنه حل "إكمال التعليمات البرمجية".الجانب السلبي هو أنه عندما يكون لديك أيضًا كتلة /// وكتلة [DefaultValue()] أعلى الخاصية بالفعل، فإنها تبدأ في الازدحام قليلاً هناك.

إذن ما الذي يعجبك أكثر، ولماذا؟هل لدى أي شخص أي أفكار أفضل؟

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

المحلول

أنا أحب الخيار الثاني تمامًا لأن أي تجنب للسلاسل/الأرقام السحرية في الكود يعد أمرًا جيدًا.IMO إذا كنت بحاجة إلى الإشارة إلى رقم أو سلسلة حرفية في الكود أكثر من مرة، فيجب أن يكون ثابتًا.في معظم الحالات، حتى لو تم استخدامه مرة واحدة فقط، فيجب أن يكون ثابتًا

نصائح أخرى

أنا أتفق معGlenn بالنسبة لوجهة نظر صعبة الإرضاء.الجواب هو كل ما يناسبك.كل هذا الكود يحدث في 10 أسطر (إذا قمت بتضمين القوس المتعرج الأخير المحذوف).لن يضيع أحد، وفرصة الخطأ في الكتابة ضئيلة جدًا (ليست مستحيلة ولكنها ضئيلة جدًا).من ناحية أخرى، إذا استخدمت المفتاح في مكان آخر، فبالتأكيد استخدم الثابت.

أنا شخصياً سأهاجمك بشأن أسلوبك في الدعامة المتعرجة.:) أنا فقط أمزح!انها حقا مسألة الاسلوب.

هذا لا يجيب على سؤالك، لكنني لا أعتقد أن "القيمة الافتراضية" تعني ما تعتقد أنه يعنيه.ولا يقوم بتعيين قيمة افتراضية لممتلكاتك.

يرى MSDN و هذا السؤال لمزيد من التفاصيل.

ربما يجادل الكثير من الناس بأن الخيار الثاني هو "الصحيح"، لأن أي قيمة تستخدم أكثر من مرة يجب إعادة هيكلتها إلى ثابت.سأستخدم الخيار الأول على الأرجح.لقد اقتربت بالفعل من الحل "اكتمل الرمز" عن طريق تغليف إدخال القاموس في خاصية مكتوبة قوية.يؤدي هذا إلى تقليل فرصة الفشل في استرداد إدخال القاموس الخاطئ أثناء التنفيذ.هناك مكانان فقط يمكن أن تخطئ فيهما عند كتابة "myKey"، في أداة getter وsetter، وسيكون من السهل جدًا اكتشاف ذلك.

الخيار الثاني سيكون فوضويًا للغاية.

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

يمكنك مطابقة أسماء الخصائص مع المفاتيح واستخدام الانعكاس للحصول على اسم البحث.

public string FirstProperty {
get {
    return Dictionary[PropertyName()];
}
set {
    Dictionary[PropertyName()] = value;
}

private string PropertyName()
{
    return new StackFrame(1).GetMethod().Name.Substring(4);
}

وهذا له فائدة إضافية تتمثل في جعل جميع عمليات تنفيذ الممتلكات الخاصة بك متطابقة، بحيث يمكنك إعدادها في الاستوديو المرئي كمقتطفات برمجية إذا كنت تريد ذلك.

@Joel أنت لا تريد الاعتماد على StackFrame. في البطانة يمكن أن يفسد يومك عندما لا تتوقعه.

لكن على السؤال:وفي كلتا الحالتين لا يهم حقا كثيرا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top