يتم تشغيل خاصية Getter دون أي شخص يتصل به

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

  •  20-09-2019
  •  | 
  •  

سؤال

أنا أعمل في .NET 3.5. لدي فئة "A" التي تحتوي على مكدس وخاصية Getter، عند استدعاءها، يزيل العنصر الأول في المكدس واسترجاعه التالي.

بعد تهيئة الفصل، رأيت أن Getter يعمل دون استدعاء، ويزيل العنصر العلوي في المكدس، وبالتالي إعطائي نتائج سيئة. لم تظهر نقطة توقف في Getter أي شخص يمر عبره.

عندما أقوم بتغيير الخاصية إلى وظيفة، يتم إرجاع المكدس موافق.

سأكون سعيدا إذا كان شخص ما يمكن أن يفسر السبب في ذلك.

هنا هي الطبقة المبسطة:

 public class A
    {
        private Stack<string> Urls;

        public A(string title, string[] array)
        {
            Urls = new Stack<string>();
            foreach (string s in array)
            {
                Urls.Push(s);
            }
        }

        public string Url
        {
            get { return Urls.Peek(); }
        }
        public string NextUrl
        {
            get{
            if (Urls.Count > 1)
                { Urls.Pop(); } 
            return Urls.Peek(); 
            };
        }            
    }
هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

Urls.Pop();

يريد أن يصبح

return Urls.Pop();

لأنها ترجع القيمة و يزيلها من القائمة في نفس الوقت


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

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

IMO، المشكلة هنا هي وجود خاصية لها آثار جانبية غير واضحة؛ يجب أن يكون هذا طريقة:

    public string GetNextUrl() { /* */ }

تحدث أشياء سيئة خلاف ذلك في كل مكان (مصحح الأخطاء، ملزمة البيانات، إلخ). لا تفترض أن شخصا ما يقرأ فقط خاصية مرة واحدة.

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

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