Avatar ·

استدعاء الطريقة الافتراضية في المُنشئ: لماذا هو خطير وكيف تتجنبه؟

مرحباً بالجميع! أنا مطور C# مبتدئ، وواجهت مشكلة. أستخدم ReSharper ولاحظت أنه يُصدر تحذيراً: «Virtual member call in a constructor». لدي كلاس أساسي `Animal` وكلاس مشتق `Dog`. في مُنشئ `Animal`، أستدعي الطريقة الافتراضية `Speak()` لتعيين اسم افتراضي. إليك المثال: ```csharp public class Animal { public string Name { get; set; } public Animal() { // ReSharper: Virtual member call in a constructor InitializeName(); } public virtual void InitializeName() { Name = "Unknown animal"; } } public class Dog : Animal { public override void InitializeName() { Name = "Buddy"; Console.WriteLine("Dog initialized!"); } } ``` عندما أنشئ `Dog dog = new Dog();`، أتوقع أن يكون الاسم "Buddy"، لكن أحياناً أحصل على سلوك غير متوقع. لماذا يحدث هذا؟ فمُنشئ الكلاس الأساسي يُستدعى قبل مُنشئ الكلاس المشتق.