Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में स्टेटिक कंस्ट्रक्टर्स का उपयोग क्या है?

एक स्टेटिक कंस्ट्रक्टर का उपयोग किसी भी स्टेटिक डेटा को इनिशियलाइज़ करने के लिए किया जाता है, या कोई विशेष एक्शन करने के लिए जिसे केवल एक बार करने की आवश्यकता होती है। यह पहली इंस्टेंस बनने से पहले या किसी भी स्टेटिक मेंबर्स के रेफरेंस होने से पहले स्वचालित रूप से कॉल होता है।

स्टेटिक कंस्ट्रक्टर के गुण

  • एक्सेस मोडिफायर्स नहीं: स्टेटिक कंस्ट्रक्टर एक्सेस मोडिफायर्स नहीं लेते और न ही पैरामीटर्स होते हैं
  • केवल एक: एक क्लास या स्ट्रक्ट में केवल एक स्टेटिक कंस्ट्रक्टर हो सकता है
  • इनहेरिट/ओवरलोड नहीं: स्टेटिक कंस्ट्रक्टर्स इनहेरिट या ओवरलोड नहीं किए जा सकते
  • डायरेक्ट कॉल नहीं: स्टेटिक कंस्ट्रक्टर को सीधे कॉल नहीं किया जा सकता - केवल CLR द्वारा स्वचालित रूप से इनवोक किया जाता है
  • नियंत्रण नहीं: यूजर का इस पर कोई नियंत्रण नहीं होता कि स्टेटिक कंस्ट्रक्टर कब एक्जीक्यूट होगा
  • पहले चलता है: पहली इंस्टेंस बनने या किसी स्टेटिक मेंबर के रेफरेंस होने से पहले चलता है। इंस्टेंस कंस्ट्रक्टर से पहले चलता है
  • फील्ड इनिशियलाइजर्स: स्टेटिक फील्ड वेरिएबल इनिशियलाइजर्स टेक्स्टुअल ऑर्डर में स्टेटिक कंस्ट्रक्टर से ठीक पहले एक्जीक्यूट होते हैं
  • एक्सेप्शन व्यवहार: अगर स्टेटिक कंस्ट्रक्टर एक्सेप्शन फेंकता है, तो रनटाइम इसे दोबारा इनवोक नहीं करेगा, और टाइप उस एप्लिकेशन डोमेन के लाइफटाइम के लिए अनइनिशियलाइज़्ड रहेगा

उदाहरण 1: बेसिक स्टेटिक कंस्ट्रक्टर

using System;

namespace DemoApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main शुरू");
            Car user = new Car();
            Car user1 = new Car();
            Console.WriteLine("Main समाप्त");
            Console.ReadLine();
        }
    }
    
    public class Car
    {
        // स्टेटिक कंस्ट्रक्टर - केवल एक बार चलता है
        static Car()
        {
            Console.WriteLine("स्टेटिक कंस्ट्रक्टर कॉल हुआ");
        }
        
        // इंस्टेंस कंस्ट्रक्टर - हर नई इंस्टेंस के लिए चलता है
        public Car()
        {
            Console.WriteLine("डिफ़ॉल्ट कंस्ट्रक्टर कॉल हुआ");
        }
    }
}

आउटपुट

Main शुरू
स्टेटिक कंस्ट्रक्टर कॉल हुआ
डिफ़ॉल्ट कंस्ट्रक्टर कॉल हुआ
डिफ़ॉल्ट कंस्ट्रक्टर कॉल हुआ
Main समाप्त

उदाहरण 2: स्टेटिक रीड-ओनली फील्ड इनिशियलाइजेशन

using System;
using System.Threading;

namespace DemoApplication
{
    public class Car
    {
        // स्टेटिक रीड-ओनली फील्ड - केवल डिक्लेरेशन या स्टेटिक कंस्ट्रक्टर में असाइन हो सकता है
        protected static readonly DateTime GlobalStartTime;
        protected int RouteNumber { get; set; }
        
        // स्टेटिक कंस्ट्रक्टर - शेयर्ड स्टेट इनिशियलाइज़ करता है
        static Car()
        {
            GlobalStartTime = DateTime.Now;
            Console.WriteLine($"स्टेटिक कंस्ट्रक्टर कॉल हुआ। ग्लोबल स्टार्ट टाइम: {GlobalStartTime:T}");
        }
        
        public Car(int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine($"Car {RouteNumber} बनाई गई।");
        }
        
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - GlobalStartTime;
            Console.WriteLine($"Car {this.RouteNumber} अपना रूट शुरू कर रही है " +
                $"{elapsedTime.TotalMilliseconds} ms बाद ग्लोबल स्टार्ट टाइम {GlobalStartTime:t} के बाद।");
        }
    }
    
    class TestCar
    {
        static void Main()
        {
            Car car1 = new Car(1);
            Car car2 = new Car(2);
            car1.Drive();
            Thread.Sleep(25);
            car2.Drive();
            Console.ReadLine();
        }
    }
}

आउटपुट

स्टेटिक कंस्ट्रक्टर कॉल हुआ। ग्लोबल स्टार्ट टाइम: 7:09:06 AM
Car 1 बनाई गई।
Car 2 बनाई गई।
Car 1 अपना रूट शुरू कर रही है 25 ms बाद ग्लोबल स्टार्ट टाइम 7:09 AM के बाद।
Car 2 अपना रूट शुरू कर रही है 50 ms बाद ग्लोबल स्टार्ट टाइम 7:09 AM के बाद।

स्टेटिक कंस्ट्रक्टर के सामान्य उपयोग मामले

1. अनमैनेज्ड कोड के लिए वॉर्पर क्लासेस

public class NativeLibraryWrapper
{
    static NativeLibraryWrapper()
    {
        // DLL लोड करें - केवल एक बार
        NativeMethods.LoadLibrary("mylib.dll");
    }
    
    // ... P/Invoke मेथड्स
}

2. रनटाइम टाइप वैलिडेशन

public class GenericRepository where T : class
{
    static GenericRepository()
    {
        // रनटाइम चेक जो कंपाइल टाइम पर नहीं किए जा सकते
        if (!typeof(T).IsClass)
            throw new InvalidOperationException("T क्लास होना चाहिए");
        
        if (typeof(T).GetConstructor(Type.EmptyTypes) == null)
            throw new InvalidOperationException("T में पैरामीटरलेस कंस्ट्रक्टर होना चाहिए");
    }
}

3. सिंगलटन पैटर्न (थ्रेड-सेफ)

public sealed class Singleton
{
    private static readonly Singleton _instance = new Singleton();
    
    // स्टेटिक कंस्ट्रक्टर आलसी इनिशियलाइजेशन सुनिश्चित करता है
    static Singleton() { }
    
    private Singleton() { }
    
    public static Singleton Instance => _instance;
}

4. कॉन्फिगरेशन/सेटिंग्स लोड करना

public class AppSettings
{
    public static string ConnectionString { get; private set; }
    public static int MaxRetryCount { get; private set; }
    
    static AppSettings()
    {
        // कॉन्फिगरेशन से एक बार लोड करें
        ConnectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
        MaxRetryCount = int.Parse(ConfigurationManager.AppSettings["MaxRetries"] ?? "3");
    }
}

स्टेटिक कंस्ट्रक्टर vs इंस्टेंस कंस्ट्रक्टर

विशेषतास्टेटिक कंस्ट्रक्टरइंस्टेंस कंस्ट्रक्टर
कब चलता हैपहली एक्सेस से पहले एक बारहर new कॉल पर
पैरामीटर्सकोई नहींहो सकते हैं
एक्सेस मोडिफायरअनुमति नहींअनुमति है
उद्देश्यस्टेटिक स्टेट इनिशियलाइज़ करेंइंस्टेंस स्टेट इनिशियलाइज़ करें
इनहेरिटेंसनहींहां (बेस कॉल कर सकते हैं)

सर्वोत्तम अभ्यास: जब एक्सप्लिसिट स्टेटिक कंस्ट्रक्टर की आवश्यकता न हो, तो स्टेटिक फील्ड्स को डिक्लेरेशन पर इनिशियलाइज़ करें बेहतर रनटाइम ऑप्टिमाइजेशन के लिए (BeforeFieldInit एट्रिब्यूट सक्षम करता है)।

  1. - C# में Main() मेथड स्टैटिक क्यों होता है?

    Main मेथड बताता है कि क्लास निष्पादित होने पर क्या करती है और अन्य ऑब्जेक्ट्स और वेरिएबल्स को इंस्टेंशिएट करती है।Main मेथड स्टैटिक होता है क्योंकि यह C# प्रोग्राम शुरू होने पर रन करने के लिए उपलब्ध होता है। यह प्रोग्राम का एंट्री पॉइंट होता है और क्लास का इंस्टेंस बनाए बिना चलता है।निम्न उदाहरण दर्

  1. - जावा में पैरामीटराइज्ड कंस्ट्रक्टर का उपयोग क्या है?

    कंस्ट्रक्टर मेथड के समान होता है और यह क्लास के ऑब्जेक्ट बनाते समय इनवोक होता है। यह आमतौर पर क्लास के इंस्टेंस वेरिएबल्स को इनिशियलाइज़ करने के लिए उपयोग किया जाता है। कंस्ट्रक्टर्स का नाम उनकी क्लास के समान होता है और इनका कोई रिटर्न टाइप नहीं होता। दो प्रकार के कंस्ट्रक्टर्स होते हैं: पैरामीटराइ

  1. - जावा में कंस्ट्रक्टर का उपयोग क्या है?

    कंस्ट्रक्टर मेथड के समान होता है और यह क्लास के ऑब्जेक्ट बनाते समय इनवोक होता है। यह आमतौर पर क्लास के इंस्टेंस वेरिएबल्स को इनिशियलाइज़ करने के लिए उपयोग किया जाता है। कंस्ट्रक्टर्स का नाम उनकी क्लास के समान होता है और इनका कोई रिटर्न टाइप नहीं होता। दो प्रकार के कंस्ट्रक्टर्स होते हैं: पैरामीटराइ