2012-04-10 35 views
5

Tôi đang tranh luận với một người bạn tuyên bố rằng nhà xây dựng tĩnh có thể nhường đường cho một điều kiện chủng tộc như một hàm tạo tĩnh có thể được gọi nhiều lần. Dường như điều này chỉ có thể xảy ra trong môi trường nhiều luồng có khối lượng cao. Điều đó thậm chí có thể?Điều kiện chủng tộc trong C# static constructor

Tôi không thể tìm thấy bất kỳ tài liệu nào để chứng minh anh ấy sai. Có ai có bất cứ cái nhìn sâu sắc về điều này?

Cảm ơn!

+0

Điều kiện cuộc đua đến nếu một chủ đề mới làm việc gì đó sẽ kích hoạt các constructor tĩnh trong khi các nhà xây dựng tĩnh vẫn đang chạy trên thread khác. Chủ đề sẽ chặn cho đến khi hàm tạo tĩnh được thực hiện đang chạy. Nhưng các nhà xây dựng tĩnh có thể chờ đợi cho rằng thread mới để hoàn thành. Xem http://stackoverflow.com/a/8883117/385844 – phoog

Trả lời

3

Trình tạo tĩnh được gọi chỉ một lần cho mỗi AppDomain.
ECMA-335 khẳng định rằng CLI trách nhiệm đảm bảo rằng: "Một loại initializer sẽ được thực hiện đúng một lần cho bất kỳ loại nào, trừ khi rõ ràng gọi bằng mã người dùng"

Và tôi chưa từng nghe một cách thuận tiện nào để gọi trình khởi tạo kiểu trong C#.

Bạn chỉ có thể gặp sự cố nếu bạn tạo phụ thuộc vòng tròn giữa Trình khởi tạo loại.
Xem ở đây cho một bài viết thú vị về vấn đề rằng:
https://msmvps.com/blogs/jon_skeet/archive/2012/04/07/type-initializer-circular-dependencies.aspx)

+0

Hoàn hảo! Cảm ơn đã giúp đỡ. – webber

+0

Bạn nên biết rằng Danh sách và Danh sách là hai loại khác nhau. Vì vậy, constructor tĩnh của List sẽ được gọi hai lần, ví dụ. –

+2

@AenSidhe Vì chúng là các kiểu khác nhau, nó không phải là một hàm tạo tĩnh giống nhau. Khi bạn áp dụng đối số kiểu như int hoặc chuỗi vào Danh sách , một loại đóng được tạo. Các loại khác nhau cũng có các biến tĩnh riêng của chúng. Phương thức khởi tạo tĩnh của kiểu mở Danh sách sẽ không được gọi. Xem phần 4.4.2 của [Đặc điểm kỹ thuật C#] (http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc) để biết thêm thông tin. – Botz3000

12

Điều đó có thể thực hiện được không?

No. CLR xử lý việc này cho bạn và ngăn các nhà thầu tĩnh được gọi nhiều lần.

Điều này được viết nhiều lần trong đặc tả ngôn ngữ C#. Ví dụ: phần 3.1 nêu rõ:

một hàm tạo tĩnh cho một loại được chạy nhiều nhất một lần cho mỗi miền ứng dụng.

+1

Điều này không đúng. Eric đưa ra một ví dụ về cách làm tại đây: http://stackoverflow.com/a/9792537/351385 – Tergiver

+3

@Tergiver Tôi đã giải quyết câu lệnh của OP "có thể nhường đường cho một điều kiện chủng tộc như một nhà xây dựng tĩnh có thể được gọi nhiều lần" - Nó luôn luôn có thể tạo ra điều kiện chủng tộc của riêng bạn, trong bất kỳ mã nào, ở bất kỳ nơi nào. Không có đảm bảo an toàn chủ đề, nhưng spec DOES cung cấp một đảm bảo rằng các nhà xây dựng tĩnh sẽ chỉ được gọi một lần, vì vậy * rằng điều kiện chủng tộc cụ thể * tiềm năng không tồn tại. –

+1

Nhưng câu hỏi đặt ra là, "Thậm chí có thể cho một cctor được gọi nhiều lần không?" Câu trả lời là, "Có, nó * là * có thể." Chỉ có thể xảy ra nếu bạn bắt đầu cuộc gọi từ bên trong chính con tàu, nhưng thực tế là có thể. – Tergiver

Các vấn đề liên quan