سؤال

مع الأخذ في الاعتبار أن "خاص" هو معدّل الوصول الافتراضي لأعضاء الفصل، فلماذا هناك حاجة إلى الكلمة الأساسية؟

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

المحلول

إنه لك (وللمشرفين المستقبليين)، وليس للمترجم.

نصائح أخرى

هناك قدر معين من المعلومات الخاطئة هنا:

"معدِّل الوصول الافتراضي ليس خاصًا ولكنه داخلي"

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

"الخاص هو الإعداد الافتراضي فقط لـ طُرق على نوع"

لا، إنه الإعداد الافتراضي لـ كل الأعضاء من نوع ما - الخصائص، والأحداث، والحقول، والمشغلين، والمنشئين، والأساليب، والأنواع المتداخلة وأي شيء آخر نسيته.

"في الواقع، إذا لم يتم الإعلان عن الفئة أو البنية باستخدام معدّل الوصول، فسيتم تعيينها افتراضيًا على المستوى الداخلي"

فقط للأنواع ذات المستوى الأعلى.بالنسبة للأنواع المتداخلة، فهي خاصة.

بخلاف تقييد الوصول إلى الممتلكات لجزء واحد دون الآخر، يكون الإعداد الافتراضي دائمًا "مقيدًا قدر الإمكان".

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

إريك ليبرت يتبع النموذج الصريح، وأنا بدأت أميل إلى هذا الاتجاه أيضًا.

يرى http://csharpin Deep.com/ViewNote.aspx?NoteID=54 لمزيد من المعلومات حول هذا الموضوع.

الصراحة.لا أستخدم الإعداد الافتراضي أبدًا وأضيف المُعدِّل بشكل صريح دائمًا.

قد يكون هذا بسبب خلفية Java الخاصة بي حيث كان الإعداد الافتراضي هو "الحزمة" (ما يعادل تقريبًا "داخليًا" في C#) وبالتالي فإن الاختلاف يزعجني دائمًا.لقد وجدت أن الصراحة هي الأفضل.

أستخدم أيضًا ReSharper الآن والذي يكون صريحًا بشكل افتراضي، لذلك فهو يؤكد ويعزز تحيّزي :)

يشرح المعدل الخاص النية.

متغير العضو الخاص غير مخصص للمعالجة المباشرة خارج الفصل.قد يتم أو لا يتم إنشاء أدوات الوصول get/set للمتغير.

الطريقة الخاصة غير مخصصة للاستخدام خارج الفصل.قد يكون هذا للوظائف الداخلية فقط.أو يمكنك جعل المُنشئ الافتراضي خاصًا لمنع إنشاء الفصل دون تمرير القيم.

يمكن أن يكون المُعدِّل الخاص (وغيره مثله) طريقة مفيدة لكتابة كود التوثيق الذاتي.

كما أشار جون سكيت في كتابه C # في العمق, ، يوجد مكان واحد في C# حيث تكون الكلمة الأساسية الخاصة مطلوبة لتحقيق التأثير.

إذا كانت ذاكرتي تعمل بشكل صحيح، فإن الكلمة الأساسية الخاصة هي الطريقة الوحيدة لإنشاء أداة getter أو setter للخاصية ذات النطاق الخاص، عندما يكون عكسها أكبر من إمكانية الوصول الخاصة.مثال:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

الكلمة الأساسية الخاصة هي مطلوب لتحقيق ذلك، لأن معدِّل إمكانية الوصول الإضافي للخاصية لا يمكنه إلا تضييق النطاق، وليس توسيعه.(وإلا، فقد يكون بمقدور الشخص إنشاء خاصية خاصة (افتراضيًا) ثم إضافة مُعدِّل عام.)

الخاص هو الإعداد الافتراضي فقط لـ طُرق على نوع ما، ولكن يتم استخدام المعدل الخاص في مكان آخر.

من مواصفات لغة C# 3.0 (msdn) القسم 3.5.1

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

  • تتمتع مساحات الأسماء ضمنيًا بإمكانية الوصول العامة المعلنة.لا يُسمح باستخدام معدّلات الوصول في إعلانات مساحة الاسم.
  • يمكن أن يكون للأنواع المعلنة في وحدات التجميع أو مساحات الأسماء إمكانية الوصول العامة أو الداخلية والتقصير إلى إمكانية الوصول الداخلي المعلن.
  • أعضاء الفصل يمكن أن يكون لديه أي من الأنواع الخمسة لإمكانية الوصول المعلنة والإعداد الافتراضي لإمكانية الوصول الخاصة المعلنة.(لاحظ أن النوع المعلن كعضو في فئة يمكن أن يكون له أي من الأنواع الخمسة لإمكانية الوصول المعلنة، في حين أن النوع المعلن كعضو في مساحة الاسم يمكن أن يكون له إمكانية وصول عامة أو داخلية معلنة فقط.)
  • يمكن أن يتمتع أعضاء البنية بإمكانية وصول عامة أو داخلية أو خاصة معلنة، ويكون لديهم افتراضيًا إمكانية وصول خاصة معلنة لأن البنيات مغلقة ضمنيًا.لا يمكن لأعضاء البنية المقدمة في البنية (أي غير الموروثة من تلك البنية) أن يتمتعوا بإمكانية وصول داخلية معلنة محمية أو محمية.(لاحظ أن النوع المُعلن كعضو في البنية يمكن أن يكون له إمكانية وصول عامة أو داخلية أو خاصة، في حين أن النوع المُعلن كعضو في مساحة الاسم يمكن أن يكون له إمكانية وصول معلنة عامة أو داخلية فقط.)
  • يتمتع أعضاء الواجهة ضمنيًا بإمكانية الوصول العامة المعلنة.لا يُسمح بمعدِّلات الوصول في إعلانات أعضاء الواجهة.
  • يتمتع أعضاء التعداد ضمنيًا بإمكانية الوصول العامة المعلنة.لا يُسمح باستخدام معدّلات الوصول في إعلانات أعضاء التعداد.

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

من أجل التماثل والتوافق مع أنماط الترميز التي تحب أن يكون كل شيء واضحًا (أنا شخصياً أحب ذلك ...)

يشير استخدام الخاص بوضوح إلى نيتك ويترك أدلة للآخرين الذين سيدعمون الكود الخاص بك؛)

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

تحديث:لم ألاحظ علامة "c#" في هذا لذا فإن إجابتي تنطبق على C++ أكثر من C#.

عادةً ما أترك الخصوصية ولكني أجدها مفيدة في ترتيب التعليمات البرمجية:

private   int    x;
public    string y;
protected float  z;

ضد:

int x;

public    string y;
protected float  z;

مثل روبرت بولسون قال في جوابه private لا يتم استخدام المُعدِّل على الأعضاء فحسب، بل أيضًا على أنواع.يصبح هذا مهمًا لأن الإعداد الافتراضي للأنواع هو internal والتي يمكن أن تتسرب عن غير قصد إذا كنت تستخدم InternalsVisibleToAttribute.

في الواقع، إذا لم يتم الإعلان عن الفئة أو البنية باستخدام معدّل الوصول، فسيتم تعيينها افتراضيًا على المستوى الداخلي.

لذا، إذا كنت تريد جعله خاصًا، فاستخدم خاصًا.

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