Cờ beforefieldinit làm gì? Khi tôi nhìn vào IL của lớp tôi, tôi thấy lá cờ này nhưng tôi không biết lá cờ này thực sự đang làm gì?
Cờ beforefieldinit làm gì? Khi tôi nhìn vào IL của lớp tôi, tôi thấy lá cờ này nhưng tôi không biết lá cờ này thực sự đang làm gì?
Câu trả lời:
Xem bài viết của tôi về vấn đề này.
Về cơ bản, beforefieldinit
có nghĩa là "kiểu có thể được khởi tạo tại bất kỳ thời điểm nào trước khi bất kỳ trường tĩnh nào được tham chiếu." Về lý thuyết , điều đó có nghĩa là nó có thể được khởi tạo rất lười biếng - nếu bạn gọi một phương thức tĩnh không chạm vào bất kỳ trường nào, thì JIT không cần phải khởi tạo kiểu.
Trong thực tế, điều đó có nghĩa là lớp được khởi tạo sớm hơn so với cách khác - nó được khởi tạo ở đầu phương thức đầu tiên có thể sử dụng nó. Hãy so sánh điều này với các loại mà không có beforefieldinit
áp dụng đối với họ, nơi mà các loại khởi tạo có thể xảy ra ngay trước khi là người đầu tiên thực tế sử dụng.
Vì vậy, giả sử chúng ta có:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Nếu cả hai kiểu đều beforefieldinit
được áp dụng cho chúng (trong C # chúng làm theo mặc định trừ khi kiểu có hàm tạo tĩnh) thì cả hai đều sẽ được khởi tạo ở đầu DoSomething
phương thức (thường là - nó không được đảm bảo). Nếu chúng không có beforefieldinit
thì chỉ một trong số chúng sẽ được khởi tạo, dựa trên cờ.
Đây là lý do tại sao chúng ta thường sử dụng một hàm tạo tĩnh (thậm chí là một hàm trống!) Khi triển khai mẫu singleton .
Có vẻ như nó sẽ thay đổi trong 4.6
beforefieldinit
hay không)?