إبطال مرجع كائن أثناء تنفيذ مؤشر ترابط آخر طريقة عليه (.NET)

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

سؤال

(أنا مهتم ب .NET CLR)

ما يحدث بالضبط عندما يغير موضوع واحد الكائن مراجع متغير أثناء تنفيذ مؤشر ترابط آخر طريقة على الكائن الأصلي؟

على سبيل المثال، قل النوع Foo لديه متغير "شريط" من النوع Bar, ، و Bar لا يوجد لديه دولة على مستوى الفصل (الآن على الأقل، أود أن أبقي هذا السيناريو بسيطا):

// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();

في غضون ذلك، قبل انتهاء هذا تنفيذ ...

// Thread 2
foo.Bar = new Bar();

ماذا يحدث للطريقة التي هي (كانت؟) تنفيذها على الموضوع 1؟ هل كل ما يحتاجه لإكماله بالفعل على المكدس؟

هل تغير الأشياء إذا كان الموضوع 2 يفعل ذلك بدلا من ذلك؟

foo.Bar = null;
هل كانت مفيدة؟

المحلول

إذا كانت المكالمة مضمونة بالفعل في الداخل SomeMethod(), ، ثم لا يحدث شيء غير عادي - this هي حجة ضمنية للأساليب، لذلك لن تستخدم قيمة الحقل (أو الممتلكات، أيهما) مباشرة.

ما إذا كان يمكنك أن تضمن حقا أن هذه مسألة أخرى.

نصائح أخرى

- تحرير: تصحيح الجملة المربكة.

حسنا، ستكون في الواقع لتعيين المتغير فعليا، لذلك فهي ليست مثل المكالمة سوف تدرك فجأة "يا أنا لاغ!" بينما تنفيذ .somethod ()

ماذا يمكن يحدث، على الرغم من أن FOO.BAR.SOMEMETHOD () لن يتم استدعاؤه () نفسه، لأن الخيط 2 سيكون له (ربما) تعيينه إلى null أولا؛ لذلك فقط لن ينفذ (سوف تعطل باستثناء المرفأ NULL).

نفس الشيء ينطبق مع مثالك الأول؛ سوف تتصل فقط .somethod على الكائن الجديد.

أعتقد أنك تفكر في أن الأمور قد تتغير بينما يركض الأمتعة، أليس كذلك؟ لا، لن يتغير شيء هناك. سيكون لها سياق نفسه.

ما يحدث بالضبط عندما يغير موضوع واحد الكائن مراجع متغير أثناء تنفيذ مؤشر ترابط آخر طريقة على الكائن الأصلي؟

ما يحدث هو إعادة كتابة التعليمات البرمجية الخاصة بك بمزامنة الوصول إلى هذه الحقول بشكل صحيح.

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