سؤال

أنا مرتبك قليلاً عندما يتم تهيئة ممتلكاتي بالضبط.

لنفترض أن لدي خاصية أعلن مثل هذا:

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

طريقة dosomething تملأ قاموس الرسائل ويعيده.

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

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

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

المحلول

يتم تشغيل هذا الرمز عندما يشير أي شخص إلى العقار ، وليس من قبل.

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

حاول تشغيل الكود الخاص بك ليس في تصحيح الأخطاء ، وجعل بعض التعليمات البرمجية تصل إلى الممتلكات الخاصة بك:

var lookup = someObject.MessageLookup;

يجعلون doSomething() تفريغ تتبع المكدس وسترى ما يحدث.

نصائح أخرى

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

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

getters property (و ToString() لهذه المسألة) من المفترض أن تكون نقي, ، وهو ما يعني في الأساس تقييمه ليس له آثار جانبية. يجب عليك إعادة كتابة الرمز للالتزام بهذا الافتراض أو ستواجهه عواقب سيئة. إذا كان يجب استخدام التهيئة البطيئة في وقت الوصول ، فاستخدم أ GetMessageLookup() الطريقة بدلا من ذلك.

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