স্ট্যাটিক কনস্ট্রাক্টর আহ্বান
স্ট্যাটিক কনস্ট্রাক্টর অটোমেটিকভাবে কল হয়:
- প্রথম ইনস্ট্যান্স তৈরি হওয়ার পূর্বে, অথবা
- যেকোনো স্ট্যাটিক মেম্বার রেফারেন্স করার পূর্বে
বৈশিষ্ট্য
- অ্যাক্সেস মডিফায়ার নেই (
public,privateলিখা যায় না) - প্যারামিটার নেয় না
- এক ক্লাসে শুধু একটি স্ট্যাটিক কনস্ট্রাক্টর থাকতে পারে
- ইনহেরিট বা ওভারলোড করা যায় না
- সরাসরি কল করা যায় না — শুধু CLR কল করে
- থ্রেড-সেফ (CLR গ্যারান্টি দেয় একবারই এক্সিকিউট হবে)
উদাহরণ
using System;
class Program {
// স্ট্যাটিক কনস্ট্রাক্টর
static Program() {
Console.WriteLine("Static Constructor Executed");
// স্ট্যাটিক ফিল্ড ইনিশিয়ালাইজেশন, লগিং, কনফিগ লোড ইত্যাদি
}
static void Main() {
Console.WriteLine("Main method started");
// প্রথম স্ট্যাটিক অ্যাক্সেস বা ইনস্ট্যান্সিয়েশন এখানে
var p = new Program();
Console.WriteLine("Instance created");
Console.ReadLine();
}
}
আউটপুট:
Static Constructor Executed Main method started Instance created
ব্যবহারের পরিস্থিতি
- স্ট্যাটিক ফিল্ড ইনিশিয়ালাইজেশন (খাস করে জটিল লজিকের)
- লগ ফাইল খোলা, কনফিগারেশন লোড করা
- আনম্যানেজড রিসোর্স সেটআপ (DLL ইমপোর্ট ইত্যাদি)
- সিঙ্গলটন প্যাটার্নে ইনস্ট্যান্স তৈরি
উদাহরণ: সিঙ্গলটনে স্ট্যাটিক কনস্ট্রাক্টর
public sealed class Singleton {
private static readonly Singleton _instance;
// স্ট্যাটিক কনস্ট্রাক্টর - লেজি ইনিিয়ালাইজেশন নিশ্চিত করে
static Singleton() {
_instance = new Singleton();
}
private Singleton() { }
public static Singleton Instance => _instance;
}
স্ট্যাটিক কনস্ট্রাক্টর vs ইনস্ট্যান্স কনস্ট্রাক্টর
| বিষয় | Static Constructor | Instance Constructor |
|---|---|---|
| কল ফ্রিকোয়েন্সি | একবার (প্রति টাইপ) | প্রতি ইনস্ট্যান্সে একবার |
| অ্যাক্সেস মডিফায়ার | নেই | public/private/protected... |
| প্যারামিটার | নেই | হতে পারে |
| this/base ব্যবহার | না | হ্যাঁ |
| ইনস্ট্যান্স মেম্বার অ্যাক্সেস | না | হ্যাঁ |
সতর্কতা
- স্ট্যাটিক কনস্ট্রাক্টরে এক্সেপশন ফেললে টাইপ अनইউজেবল হয়ে যায় (TypeInitializationException)
- সাইক্লিক ডিপেন্ডেন্সি (দুই স্ট্যাটিক ক্লাস একে অপর রেফারেন্স) ডেডলক সৃষ্টি করতে পারে
- বেন্চমার্কিং-এ স্ট্যাটিক কনস্ট্রাক্টর টাইম কাউন্ট হয় না (JIT-এ হলেও)