कंस्ट्रक्टर में वर्चुअल मेथड कॉल: यह खतरनाक क्यों है और इससे कैसे बचें?
सभी को नमस्कार! मैं एक शुरुआती 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" होगा, लेकिन कभी-कभी मुझे अप्रत्याशित व्यवहार मिलता है। ऐसा क्यों होता है? आखिर बेस क्लास का कंस्ट्रक्टर व्युत्पन्न कंस्ट्रक्टर से पहले कॉल होता है।