परिचय
\nC# डेवलपर पद के लिए साक्षात्कार केवल सिंटैक्स की जाँच नहीं है। नियोक्ता .NET प्लेटफ़ॉर्म की समझ, CLR के कार्य सिद्धांतों, कुशल कोड लिखने की क्षमता और आधुनिक दृष्टिकोणों (async, LINQ, DI) का ज्ञान देखना चाहते हैं।
\nइस लेख में हम C# पर A से Z तक शीर्ष प्रश्नों का विश्लेषण करेंगे - बुनियादी डेटा प्रकारों से लेकर कचरा संग्रह और एसिंक्रोनस प्रोग्रामिंग जैसे जटिल विषयों तक। प्रत्येक प्रश्न के साथ एक संक्षिप्त उत्तर और कोड उदाहरण दिया गया है, ताकि आप साक्षात्कार में आत्मविश्वास महसूस कर सकें।
\n\n1. बुनियादी प्रश्न: प्रकार, क्लास और मेमोरी
\n\n1.1. Value Type और Reference Type में क्या अंतर है?
\nValue Type (int, struct, enum) स्टैक में संग्रहीत होते हैं और मान द्वारा कॉपी किए जाते हैं। Reference Type (class, string, array) हीप में संग्रहीत होते हैं, वेरिएबल में ऑब्जेक्ट का संदर्भ होता है।
\nint a = 10;\nint b = a; // b एक कॉपी है, a और b स्वतंत्र हैं\n\nclass MyClass { public int X; }\nMyClass obj1 = new MyClass { X = 5 };\nMyClass obj2 = obj1; // obj2 उसी ऑब्जेक्ट को संदर्भित करता है\nobj2.X = 10; // obj1.X भी 10 हो जाएगा\n\n1.2. Boxing और Unboxing क्या है?
\nBoxing - मान प्रकार को ऑब्जेक्ट (हीप में) में पैक करना। Unboxing - विपरीत प्रक्रिया। बार-बार उपयोग प्रदर्शन को कम करता है।
\nint number = 42;\nobject boxed = number; // Boxing\nint unboxed = (int)boxed; // Unboxing\n\n1.3. कचरा संग्रहकर्ता (Garbage Collector) के बारे में बताएं।
\n.NET में GC स्वचालित रूप से उन ऑब्जेक्ट्स से मेमोरी मुक्त करता है जिनका कोई संदर्भ नहीं है। यह पीढ़ियों (Gen 0, 1, 2) में काम करता है। बड़े आकार के ऑब्जेक्ट्स (>85 KB) Large Object Heap (LOH) में जाते हैं।
\nसुझाव: GC.Collect() को मैन्युअल रूप से कॉल न करें - यह GC के ऑप्टिमाइज़ेशन को बाधित करता है।
2. OOP और डिज़ाइन सिद्धांत
\n\n2.1. SOLID सिद्धांतों की व्याख्या करें।
\n- \n
- S — Single Responsibility: एक क्लास में बदलाव का एक ही कारण होना चाहिए। \n
- O — Open/Closed: विस्तार के लिए खुला, संशोधन के लिए बंद। \n
- L — Liskov Substitution: उपवर्गों को बेस क्लास को सही ढंग से बदलने में सक्षम होना चाहिए। \n
- I — Interface Segregation: एक बड़े इंटरफ़ेस की तुलना में कई छोटे इंटरफ़ेस बेहतर हैं। \n
- D — Dependency Inversion: निर्भरताएँ अमूर्तताओं पर होनी चाहिए, ठोस क्लास पर नहीं। \n
2.2. Dependency Injection (DI) क्या है?
\nDI एक पैटर्न है जिसमें निर्भरताएँ बाहर से क्लास में पास की जाती हैं (कंस्ट्रक्टर, मेथड या प्रॉपर्टी के माध्यम से)। .NET Core में बिल्ट-इन DI कंटेनर है।
\npublic interface ILogger\n{\n void Log(string message);\n}\n\npublic class ConsoleLogger : ILogger\n{\n public void Log(string message) => Console.WriteLine(message);\n}\n\npublic class OrderService\n{\n private readonly ILogger _logger;\n public OrderService(ILogger logger) // कंस्ट्रक्टर के माध्यम से DI\n {\n _logger = logger;\n }\n}\n\n3. LINQ, अपवाद और स्ट्रिंग्स
\n\n3.1. LINQ कैसे काम करता है? विलंबित निष्पादन (Deferred Execution) क्या है?
\nLINQ (Language Integrated Query) कलेक्शन, डेटाबेस (EF Core) और XML पर क्वेरी लिखने की अनुमति देता है। विलंबित निष्पादन का अर्थ है कि क्वेरी केवल परिणाम को पुनरावृत्त करने पर निष्पादित होती है (जैसे, foreach या .ToList() के माध्यम से)।
var numbers = new List<int> { 1, 2, 3, 4, 5 };\nvar query = numbers.Where(n => n > 2); // क्वेरी निष्पादित नहीं हुई\nnumbers.Add(6); // क्वेरी बनाने के बाद जोड़ा\nforeach (var n in query) // यहाँ निष्पादन\n Console.WriteLine(n); // 3, 4, 5, 6\n\n3.2. String और StringBuilder में क्या अंतर है?
\nString - अपरिवर्तनीय प्रकार। प्रत्येक संयोजन ऑपरेशन एक नया ऑब्जेक्ट बनाता है। StringBuilder परिवर्तनीय बफ़र का उपयोग करता है और स्ट्रिंग में कई बदलावों के लिए कुशल है।
\n// खराब (कई आवंटन)\nstring s = "";\nfor (int i = 0; i <