it-swarm.asia

إعلان Getter و Setter في .NET

كنت أتساءل ما هي الاختلافات بين إعلان الأقليات والمستوطنين وما إذا كانت هناك طريقة مفضلة (ولماذا). يمكن إنشاء أول واحد تلقائيًا بواسطة Visual Studio. ماذا عن الآخرين؟ شكر

1

string _myProperty { get; set; }

2

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

3

string _myProperty;

public string getMyProperty()
{
  return this._myProperty;
}

public void setMyProperty(string value)
{
  this._myProperty = value;
}
127
WizLiz

تستخدم الخصائص لتغليف بعض البيانات. يمكنك استخدام حقل عادي:

public string MyField

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

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

string MyProperty { get; set; }

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

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

يمكنك الآن إضافة رمز يتحقق من صحة القيمة في setter:

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

يمكن أن تحتوي الخصائص أيضًا على وحدات وصول مختلفة للرابط والمضبط:

public string MyProperty { get; private set; }

بهذه الطريقة تقوم بإنشاء خاصية يمكن قراءتها من قِبل الجميع ولكن يمكن تعديلها فقط بواسطة الفصل نفسه.

يمكنك أيضًا إضافة تطبيق مخصص بالكامل لـ getter:

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

عندما تقوم C # بتجميع الخاصية التي يتم تنفيذها تلقائيًا ، فإنها تنشئ لغة متوسطة (IL). في IL ، سترى طريقة get_MyProperty و set_MyProperty. كما أنه ينشئ حقل دعم يسمى <MyProperty>k_BackingField (عادةً ما يكون هذا اسمًا غير قانوني في C # ولكن في IL فهو صالح. وبهذه الطريقة لن تحصل على أي تعارض بين الأنواع التي تم إنشاؤها ورمزك الخاص). ومع ذلك ، يجب عليك استخدام بناء جملة الخاصية الرسمية في C #. هذا يخلق تجربة أجمل في C # (على سبيل المثال مع التحسس الذكي).

وفقًا للاتفاقية ، يجب ألا تستخدم الخصائص للعمليات التي تستغرق وقتًا طويلاً.

177
Wouter de Kort

حسنًا ، يولد الأول والثاني شيئًا مثل الثالث في النهاية. ومع ذلك ، لا تستخدم الثالث عندما يكون لديك بناء جملة للخصائص.

أخيرًا ، إذا لم يكن لديك عمل لتفعله في get أو set ، فاستخدم الأول.

في النهاية ، الأول والثاني هما مجرد شكل من أشكال السكر النحوي ، ولكن لماذا الكود أكثر من اللازم.

// more code == more bugs

وللحصول على القليل من المرح ، فكر في هذا:

public string A { get; private set; }

الآن هذا كثيرًا للأمام بشكل مستقيم أليس كذلك؟ معدل public هو ضمني على كل get و set ، لكن يمكن تجاوزه. سيكون هذا بالطبع هو نفس القاعدة لأي معدل مستخدم عند تعريف الخاصية نفسها.

12
Mike Perrenoud

1

string _myProperty { get; set; }

وهذا ما يسمى خاصية السيارات في العالم. NET. انها مجرد السكر النحوي ل # 2.

2

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

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

3

string _myProperty;

public string getMyProperty()
{
    return this._myProperty;
}

public string setMyProperty(string value)
{
    this._myProperty = value;
}

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

9
Andrew Grothe

باستخدام هذا ، يمكنك تنفيذ بعض التعليمات البرمجية في نطاق get أو set.

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

يمكنك أيضًا استخدام الخصائص التلقائية:

public string myProperty
{
    get;
    set;
}

و. صافي الإطار سوف تدير لك. لقد تم إنشاؤه لأنها عملية جيدة وتجعلها سهلة.

يمكنك أيضًا التحكم في رؤية هذه النطاقات ، لعينة:

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}

تحديث

الآن في C # يمكنك تهيئة قيمة خاصية. لعينة:

public int Property { get; set; } = 1;

إذا كان بإمكانك أيضًا تعريفه وجعله للقراءة فقط ، بدون مجموعة.

public int Property { get; } = 1;

وأخيرا ، يمكنك تحديد وظيفة السهم.

public int Property { get; } => GetValue();
4
Felipe Oriani

فقط للتوضيح ، في المثال الثالث _myProperty ليست في الواقع خاصية. إنه حقل يحتوي على أساليب get and set (وكما سبق ذكره ، يجب أن تحدد أساليب get and set أنواع الإرجاع).

في C # يجب تجنب الطريقة الثالثة في معظم الحالات. كنت تستخدمه حقًا فقط إذا كان النوع الذي تريد إرجاعه عبارة عن صفيف ، أو إذا كان أسلوب get قد أدى الكثير من العمل بدلاً من مجرد إرجاع قيمة. هذا الأخير ليس ضروريًا حقًا ولكن لغرض الوضوح فإن طريقة الحصول على العقار التي تقوم بالكثير من العمل مضللة.

2
OnABauer

لنبدأ بـ 3. هذا لن ينجح. public getMyProperty() لا يوجد لديه إرجاع الطباع.

والرقم 1 و 2 هي في الواقع نفس الأشياء. 2 هو ما يصبح الرقم 1 بعد التجميع.

لذلك 1 و 2 هي نفس الأشياء. مع اثنين يمكنك الحصول على بعض التحقق من الصحة أو التخزين المؤقت في النموذج الخاص بك.

بخلاف ذلك تصبح نفسها.

1
DarthVader

الأول هو الافتراضي ، عندما لا يوجد شيء خاص للعودة أو الكتابة. الثانية والثالثة هي في الأساس نفسه حيث الثالث هو نسخة موسعة أكثر قليلاً من الثاني

0
NG.

الأول هو النموذج "القصير" - الذي تستخدمه ، عندما لا تريد أن تفعل شيئًا خياليًا مع رسائلك وأركابك. لا يمكن تنفيذ طريقة أو شيء من هذا القبيل في هذا النموذج.

النموذج الثاني والثالث متطابقان تقريبًا ، وإن كان النموذج الثاني مضغوطًا على سطر واحد. تم إحباط هذا النموذج بواسطة stylecop لأنه يبدو غريبًا إلى حد ما ولا يتوافق مع C 'Stylguides.

كنت أستخدم النموذج الثالث إذا كنت أتوقع استخدام أدوات/أدوات تسوية لشيء خاص ، على سبيل المثال استخدام بناء كسول أو نحو ذلك.

0
Christian Sauer