سؤال

ما هي ميزة وجود this/self/me مؤشر إلزامي صريح؟

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

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

المحلول

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

على سبيل المثال، إذا كان لديك رمز مثل:

someMethod(some, parameters) {
    ... a segment of code
    foo = 42;
    ... another segment of code
}

عند التصفح بسرعة من خلاله، يجب أن يكون لديك نموذج عقلي للمتغيرات المحددة في الجزء السابق لمعرفة ما إذا كان مجرد متغير مؤقت أم لا يتحول حالة الكائنات. في حين أن هذا .foo = 42 يجعل من الواضح أن حالة الكائنات تحتيت. وإذا استخدمت dereferencing صريحة حصريا، فيمكنك التأكد من أن المتغير مؤقت في الحالة المعاكسة.

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

نصائح أخرى

إذا كنت تتحدث عن "صريح self"بمعنى بيثون، وهنا مناقشة مثيرة للاهتمام في هذا الموضوع. هنا Guido يستجيب ل مقالة بروس ايكيل. وبعد التعليقات على مقالة بروس هي أيضا تنورة (بعضها، على أي حال).

أنت في حاجة إليها لتمرير المؤشر / المرجع إلى الكائن الحالي في مكان آخر أو للحماية من التعيين الذاتي في أحد مشغل التعيين.

ماذا لو كانت الحجج الموجودة في الطريقة نفس الاسم مثل المتغيرات الأعضاء؟ ثم يمكنك استخدام this.x = x علي سبيل المثال. أين this.x هو متغير العضو و x هي حجة الطريقة. هذا مجرد مثال واحد (تافهة).

أنا عموما استخدام هذا (في C ++) فقط عندما أكتب مهمة تشغيل أو ال نسخ المنشئ لأنها تساعد في تحديد المتغيرات بوضوح. مكان آخر حيث يمكنني التفكير في استخدامه هو إذا كانت أسماء متغيرات مع المعلمة وظيفتك هي نفس أسماء الأعضاء الخاصة بك أو أريد قتل كائنتي باستخدام امسح هذه.

على سبيل المثال، سيكون أسماء الأعضاء هي نفسها مثل تلك التي تم تمريرها إلى الأسلوب

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top