Bạn chỉ hỏi một câu hỏi ở đây nhưng có rất nhiều câu hỏi mà bạn nên hỏi, vì vậy tôi sẽ trả lời tất cả.
Đây là trình tự mà tôi đã giả định
- Bắt đầu của hàm tạo lớp (còn được gọi là
cctor
)
- Cuối cctor
- bắt đầu của Main
- bắt đầu của MyMethod
Điều này có chính xác?
Không. Trình tự đúng là:
- Bắt đầu cctor cho Chương trình, nếu có. Không có.
- Kết thúc cctor cho Chương trình, nếu có. Không có.
- Bắt đầu chính
- Bắt đầu cctor cho MyClass
- Kết thúc cctor cho MyClass
- Khởi động MyClass.MyMethod
Nếu có một bộ khởi tạo trường tĩnh thì sao?
CLR được phép thay đổi thứ tự chạy các trình khởi tạo trường tĩnh trong một số trường hợp. Xem trang của Jon về chủ đề này để biết thêm chi tiết:
Sự khác biệt giữa hàm tạo tĩnh và bộ khởi tạo kiểu
Có bao giờ một phương thức tĩnh giống như MyMethod
được gọi trước khi cctor của lớp đó hoàn thành không?
Đúng. Nếu cctor tự gọi MyMethod thì hiển nhiên MyMethod sẽ được gọi trước khi cctor hoàn thành.
Cctor không gọi MyMethod. Có bao giờ một phương thức tĩnh như MyMethod
được gọi trước khi cctor của MyClass hoàn tất không?
Đúng. Nếu cctor sử dụng kiểu khác mà cctor gọi MyMethod thì MyMethod sẽ được gọi trước khi cctor MyClass hoàn thành.
Không có diễn viên nào gọi MyMethod, trực tiếp hay gián tiếp! Bây giờ có khi nào một phương thức tĩnh như MyMethod
được gọi trước khi cctor của MyClass hoàn tất không?
Không.
Điều đó vẫn đúng ngay cả khi có nhiều chủ đề liên quan?
Đúng. Cctor sẽ kết thúc trên một luồng trước khi phương thức tĩnh có thể được gọi trên bất kỳ luồng nào.
Có thể gọi cctor nhiều hơn một lần không? Giả sử cả hai luồng đều làm cho cctor được chạy.
Cctor được đảm bảo sẽ được gọi nhiều nhất một lần, bất kể có bao nhiêu luồng tham gia. Nếu hai luồng gọi MyMethod "cùng một lúc" thì chúng sẽ chạy đua. Một trong số họ thua cuộc đua và bị chặn cho đến khi cctor MyClass hoàn thành trên chuỗi chiến thắng.
Các khối luồng bị mất cho đến khi cctor được thực hiện? Thật không?
Có thật không.
Vì vậy, điều gì sẽ xảy ra nếu cctor trên chuỗi thắng cuộc gọi mã chặn trên một ổ khóa mà chuỗi thua đã lấy trước đó ?
Sau đó, bạn có một điều kiện đảo ngược thứ tự khóa cổ điển. Chương trình của bạn bế tắc. Mãi mãi.
Điều đó có vẻ nguy hiểm. Làm thế nào tôi có thể tránh khỏi bế tắc?
Nếu bạn cảm thấy đau khi làm điều đó thì hãy ngừng làm điều đó . Đừng bao giờ làm điều gì đó có thể gây tắc nghẽn trong cctor.
Có nên dựa vào ngữ nghĩa khởi tạo cctor để thực thi các yêu cầu bảo mật phức tạp không? Và có phải là một ý kiến hay nếu có một cctor tương tác với người dùng?
Không phải là những ý tưởng tốt. Lời khuyên của tôi là bạn nên tìm một cách khác để đảm bảo rằng các điều kiện tiên quyết ảnh hưởng đến bảo mật của các phương pháp của bạn được đáp ứng.