Một câu hỏi về SO cảm hứng cho tôi để thử mã này trong C#:Tạo một thể hiện của một lớp trong hàm tạo tĩnh của nó - tại sao nó được cho phép?
class Program
{
static Program()
{
new Program().Run();
}
static void Main(string[] args) { }
void Run()
{
System.Console.WriteLine("Running");
}
}
này in ra "Chạy" khi chạy.
Tôi thực sự mong đợi trình biên dịch khiếu nại về điều này. Sau khi tất cả, nếu lớp chưa được khởi tạo bởi hàm tạo tĩnh; làm thế nào chúng ta có thể chắc chắn rằng nó là hợp lệ để gọi các phương pháp trên đó?
Vậy tại sao trình biên dịch không hạn chế chúng tôi thực hiện việc này? Có tình huống sử dụng quan trọng nào cho điều này không?
Chỉnh sửa
Tôi biết về mẫu Singleton; điểm trong câu hỏi là tại sao tôi có thể gọi một phương thức trên cá thể trước khi constructor tĩnh của tôi kết thúc. Cho đến nay câu trả lời của JaredPar có một số lý do tốt về điều này.
Với mẫu đơn, thực tế là * thực hành tốt nhất * để khởi tạo lớp kèm theo trong hàm tạo tĩnh (hoặc trong trình khởi tạo trường tĩnh, số tiền tương tự) –