Bạn chỉ hỏi một câu hỏi tại đây nhưng có một tá câu hỏi mà bạn nên đã hỏi, vì vậy tôi sẽ trả lời tất cả.
Dưới đây là trình tự mà tôi cho rằng
- Bắt đầu constructor lớp (còn gọi là
cctor
)
- Cuối cctor
- đầu Main
- đầu MyMethod
Điều này có đúng không?
số 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 Main
- Bắt đầu cctor cho MyClass
- Cuối cctor cho MyClass
- Bắt đầu MyClass.MyMethod
gì nếu có một lĩnh vực initializer tĩnh?
CLR được phép thay đổi thứ tự khởi tạo trường tĩnh trong một số trường hợp. Xem trang Jon về chủ đề để biết chi tiết:
The differences between static constructors and type initializers
Có bao giờ có thể cho một phương pháp tĩnh như MyMethod
được gọi trước khi cctor của lớp đó hoàn thành?
Có.Nếu chính cctor gọi MyMethod thì rõ ràng MyMethod sẽ được gọi trước khi cctor hoàn tất.
CCtor không gọi MyMethod. Có bao giờ có thể cho một phương pháp tĩnh như MyMethod
để được gọi trước khi cctor của MyClass hoàn thành?
Có. Nếu CCtor sử dụng một kiểu khác mà CCtor gọi MyMethod thì MyMethod sẽ được gọi trước khi MyClass CCtor hoàn tất.
Không có cctors gọi MyMethod, trực tiếp hoặc gián tiếp! Bây giờ là nó có thể bao giờ có thể cho một phương pháp tĩnh như MyMethod
để được gọi trước khi các cctor của MyClass hoàn thành?
số
Có phải đó là vẫn đúng ngay cả khi có nhiều chủ đề liên quan?
Có. 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.
CCtor có thể được gọi nhiều lần không? Giả sử hai luồng đều làm cho cctor chạy.
CCtor được đảm bảo được gọi tối đa một lần, cho dù có bao nhiêu chủ đề. Nếu hai chủ đề gọi MyMethod "cùng một lúc" thì họ chạy đua. Một trong số họ mất cuộc đua và chặn cho đến khi người quản lý MyClass hoàn thành chuỗi chiến thắng.
Chủ đề bị mất khối cho đến khi cctor được thực hiện? Thực sự?
Thực sự.
Vì vậy, những gì nếu cctor trên thread chiến thắng gọi mã mà khối trên một khóa trước đây được thực hiện bởi mất chủ đề?
Sau đó, bạn có điều kiện đảo ngược lệnh khóa cổ điển. Chương trình deadlocks của bạn. Mãi mãi.
Điều đó có vẻ nguy hiểm. Làm thế nào tôi có thể tránh được bế tắc?
Nếu bị đau khi bạn làm như vậy thì ngừng làm điều đó. Không bao giờ làm điều gì đó có thể chặn trong một người quản lý.
Bạn nên dựa vào ngữ nghĩa khởi tạo của cctor để thực thi các yêu cầu bảo mật phức tạp? Và có một ý tưởng hay để có một người giao dịch có tương tác với người dùng không?
Không phải là ý tưởng hay. 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 bảo mật tác động của các phương pháp của bạn được đáp ứng.
Đây có phải là câu hỏi java hay C# không? Bạn đã đặt cả hai thẻ và tôi không nghĩ rằng đặc điểm kỹ thuật giống nhau trong hai ngôn ngữ. – ARRG
Trong phần mở rộng của tôi, nó giống với cả hai .. Nhưng tôi là C# guy .. Sry cho rằng – om471987
Java không có một hàm tạo tĩnh theo cùng một cách, chỉ các khối tĩnh để khởi tạo tĩnh. static {// do something ...} – deraj