একটি স্ট্যাটিক কনস্ট্রাক্টর যেকোনো স্ট্যাটিক ডেটা ইনিশিয়ালাইজ করতে বা এমন একটি ক্রিয়া সম্পাদন করতে ব্যবহৃত হয় যা শুধু একবার করা দরকার। এটি প্রথম ইনস্ট্যান্স তৈরি হওয়ার আগে বা যেকোনো স্ট্যাটিক মেম্বার রেফারেন্স হওয়ার আগে স্বয়ংক্রিয়ভাবে কল করা হয়।
অ্যানম্যানেজড কোডের জন্য র্যাপার ক্লাস তৈরি করার সময় স্ট্যাটিক কনস্ট্রাক্টর উপকারী হয়, যখন কনস্ট্রাক্টর LoadLibrary মেথড কল করতে পারে। স্ট্যাটিক কনস্ট্রাক্টর কম্পাইল টাইমে কনস্ট্রেইন্টসের মাধ্যমে চেক করা যাবে না এমন টাইপ প্যারামিটারে রান-টাইম চেক এনফোর্স করার জন্যও একটি সুবিধাজনক জায়গা।
স্ট্যাটিক কনস্ট্রাক্টরের বৈশিষ্ট্যগুলো নিচে দেওয়া হল:
- একটি স্ট্যাটিক কনস্ট্রাক্টর এক্সেস মডিফায়ার নেয় না বা প্যারামিটার রাখে না।
- একটি ক্লাস বা স্ট্রাক্টের শুধু একটি স্ট্যাটিক কনস্ট্রাক্টর থাকতে পারে।
- স্ট্যাটিক কনস্ট্রাক্টর ইনহেরিট বা ওভারলোড করা যায় না।
- একটি স্ট্যাটিক কনস্ট্রাক্টর সরাসরি কল করা যাবে না এবং এটি শুধু কমন ল্যাঙ্গুয়েজ রানটাইম (CLR) দ্বারা কল করার জন্য বাঁচানো থাকে। এটি স্বয়ংক্রিয়ভাবে আহ্বান করা হয়।
- ইউজারদের প্রোগ্রামে স্ট্যাটিক কনস্ট্রাক্টর কখন এক্সিকিউট হবে সেটার ওপর কোনো কন্ট্রোল নেই।
- প্রথম ইনস্ট্যান্স তৈরি হওয়ার আগে বা যেকোনো স্ট্যাটিক মেম্বার রেফারেন্স হওয়ার আগে ক্লাস ইনিশিয়ালাইজ করার জন্য একটি স্ট্যাটিক কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কল করা হয়। একটি স্ট্যাটিক কনস্ট্রাক্টর ইনস্ট্যান্স কনস্ট্রাক্টরের আগে চলে। একটি টাইপের স্ট্যাটিক কনস্ট্রাক্টর কল করা হয় যখন একটি স্ট্যাটিক মেথড একটি ইভেন্ট বা ডেলিগেটে অ্যাসাইন করা হয়, অ্যাসাইন করার সময় নয়। যদি স্ট্যাটিক ফিল্ড ভেরিয়েবল ইনিশিয়ালাইজার ক্লাসে উপস্থিত থাকে, তবে সেগুলো ক্লাস ডিক্লэрেশনে যেভাবে görünেছে সেই টেক্সটুয়াল অর্ডারে স্ট্যাটিক কনস্ট্রাক্টর এক্সিকিউশনের ঠিক আগে এক্সিকিউট হবে।
- যদি আপনি স্ট্যাটিক ফিল্ড ইনিশিয়ালাইজ করার জন্য স্ট্যাটিক কনস্ট্রাক্টর প্রদান না করেন, তবে সমস্ত স্ট্যাটিক ফিল্ড C# টাইপের ডিফল্ট মানগুলোর সাথে ইনিশিয়ালাইজ হয়।
- যদি একটি স্ট্যাটিক কনস্ট্রাক্টর এক্সেপশন থ্রো করে, তবে রানটাইম এটি দ্বিতীয়বার আহ্বান করবে না, এবং টাইপটি আপনার প্রোগ্রাম চলমান অ্যাপ্লিকেশন ডোমেনের লাইফটাইমের জন্য আনইনিশিয়ালাইজড থাকবে। সাধারণত, একটি TypeInitializationException এক্সেপশন থ্রো হয় যখন একটি স্ট্যাটিক কনস্ট্রাক্টর একটি টাইপ ইনস্ট্যান্সিয়েট করতে অক্ষম হয় বা স্ট্যাটিক কনস্ট্রাক্টরের মধ্যে অনহ্যান্ডল্ড এক্সেপশন ঘটে। ইমপ্লিসিট স্ট্যাটিক কনস্ট্রাক্টর যা সোর্স কোডে স্পষ্টভাবে ডিফাইন করা নেই, ট্রাবলশুটিং-এর জন্য ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (IL) কোড ইনস্পেকশন প্রয়োজন হতে পারে।
- একটি স্ট্যাটিক কনস্ট্রাক্টর উপস্থিত থাকলে BeforeFieldInit টাইপ অ্যাট্রিবিউট যোগ হওয়া বাধা দেয়। এটি রানটাইম অপ্টিমাইজেশন সীমাবদ্ধ করে।
- static readonly ঘোষিত একটি ফিল্ড শুধু তার ঘোষণার অংশ হিসেবে বা একটি স্ট্যাটিক কনস্ট্রাক্টরে অ্যাসাইন করা যেতে পারে। যখন একটি স্পষ্ট স্ট্যাটিক কনস্ট্রাক্টর আবশ্যক না হয়, তখন রানটাইম অপ্টিমাইজেশনের জন্য স্ট্যাটিক ফিল্ডগুলো ঘোষণার সময় ইনিশিয়ালাইজ করুন, স্ট্যাটিক কনস্ট্রাক্টরের মাধ্যমে না।
উদাহরণ
using System;
namespace DemoApplication
{
public class Program
{
static void Main(string[] args)
{
Car user = new Car();
Car user1 = new Car();
Console.ReadLine();
}
}
public class Car
{
static Car()
{
Console.WriteLine("Static constructor called");
}
public Car()
{
Console.WriteLine("Default constructor called");
}
}
}
আউটপুট
Static constructor called Default constructor called Default constructor called
উপরের উদাহরণে আমরা দেখতে পাচ্ছি যে স্ট্যাটিক কনস্ট্রাক্টর শুধু একবার কল করা হয়েছে।
উদাহরণ ২
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($"Static constructor called. Global start time: {globalStartTime.ToLongTimeString()}");
}
public Car(int routeNum)
{
RouteNumber = routeNum;
Console.WriteLine($"Car {RouteNumber} is created.");
}
public void Drive()
{
TimeSpan elapsedTime = DateTime.Now - globalStartTime;
Console.WriteLine($"Car {this.RouteNumber} is starting its route {elapsedTime.Milliseconds} minutes after global start time {globalStartTime.ToShortTimeString()}.");
}
}
class TestCar
{
static void Main()
{
Car car1 = new Car(1);
Car car2 = new Car(2);
car1.Drive();
Thread.Sleep(25);
car2.Drive();
Console.ReadLine();
}
}
}
আউটপুট
Static constructor called. Global start time: 7:09:06 AM Car 1 is created. Car 2 is created. Car 1 is starting its route 25 minutes after global start time 7:09 AM. Car 2 is starting its route 50 minutes after global start time 7:09 AM.