2009-08-17 26 views
11

Trong đoạn này:C#: Chuyển nhượng trường này có an toàn không?

class ClassWithConstants 
{ 
    private const string ConstantA = "Something"; 
    private const string ConstantB = ConstantA + "Else"; 

    ... 

} 

Có một nguy cơ kết thúc với ConstantB == "Else"? Hay làm các sự xác nhận xảy ra một cách tuyến tính?

+0

@Svish, vui lòng xem bình luận của Jon Skeet về câu trả lời của ông –

+0

@ Nathan, cảm ơn, đã không nhận ra điều này: p – Svish

Trả lời

37

Bạn sẽ luôn nhận được "SomethingElse". Điều này là do ConstantB phụ thuộc vào ConstantA.

Bạn thậm chí có thể chuyển đổi các đường và bạn sẽ nhận được kết quả tương tự. Trình biên dịch biết rằng ConstantB phụ thuộc vào ConstantA và sẽ xử lý nó cho phù hợp, ngay cả khi bạn viết nó trong các lớp một phần.

Để hoàn toàn chắc chắn bạn có thể chạy Dấu nhắc lệnh và gọi ILDASM. Ở đó bạn có thể thấy mã được biên dịch thực tế.

Ngoài ra, nếu bạn cố gắng làm những điều sau đây bạn sẽ nhận được một lỗi biên dịch:

private const string ConstantB = ConstantA + "Else"; 
private const string ConstantA = "Something" + ConstantB; 

Lỗi: Việc đánh giá các giá trị không đổi cho 'ConsoleApplication2.Program.ConstantB' liên quan đến một định nghĩa tròn Loại chứng minh trình biên dịch này biết các phụ thuộc của nó.


Added: Spec tài liệu tham khảo đã chỉ ra bởi Jon Skeet:

This is explicitly mentioned in section 10.4 of the C# 3 spec: Constants are permitted to depend on other constants within the same program as long as the dependencies are not of a circular nature. The compiler automatically arranges to evaluate the constant declarations in the appropriate order.


+2

Yup, bạn đúng rồi - doh! :) Cố gắng tìm bit trong spec đảm bảo điều này ... –

+0

Tìm thấy nó ngay bây giờ - phần 10.4. –

+3

Đã chỉnh sửa câu trả lời của tôi vì vậy ít nhất nó sẽ không đánh lừa mọi người, nhưng sẽ xóa nó nếu/khi tôi có thể. –

3

chuỗi nối này xảy ra tại thời gian biên dịch vì chỉ có chuỗi ký tự (tìm kiếm hằng số trong tài liệu xây dựng trình biên dịch).

Đừng lo lắng về điều đó.

2

Nó phải luôn luôn đánh giá là "SomethingElse"