2014-04-08 12 views
7

Hãy xem xét các lớp sau đây:Hành vi lạ trên các thành viên tĩnh của một lớp - Làm thế nào điều này có thể?

public class MyClass 
{ 
    public static string[] SomeAmazingConsts = { Const1 }; 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
} 

Bây giờ, hãy kiểm tra việc sử dụng:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] s = MyClass.SomeAmazingConsts; 
     //s[0] == null 
    } 
} 

Vấn đề là s [0] == null! Chuyện này xảy ra như thế nào? Bây giờ, sắp xếp lại biến tĩnh của MyClass như sau:

public class MyClass 
{ 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
    public static string[] SomeAmazingConsts = { Const1 }; 
} 

Mọi thứ bắt đầu hoạt động bình thường. Bất cứ ai cũng có thể làm sáng tỏ điều này?

+0

Bạn đang gán một tham chiếu null để mảng, nó không thể kỳ diệu được tái giao giá trị sửa đổi – jedgard

Trả lời

11

Từ 10.4.5.1 Static field initialization

Trường initializers biến tĩnh của một lớp tương ứng với một chuỗi các bài tập được thực hiện theo thứ tự văn bản trong mà chúng xuất hiện trong khai báo lớp.

Vì vậy, việc khởi tạo xảy ra trên xuống dưới, và trong trường hợp đầu tiên Const1 chưa được khởi tạo, vì thế mà null

+0

Vậy tại sao trình biên dịch không dừng lại tôi ở "chuỗi tĩnh công cộng [] SomeAmazingConsts = {Const1};" hàng? Vì Const1 là một biến tĩnh và nó chưa được khởi tạo, chúng có thể (?) Ngăn tôi sử dụng nó trước khi nó được xác định ngay từ đầu. BTW, làm thế nào tôi có thể chắc chắn rằng sắp xếp lại không ảnh hưởng đến việc thực thi mã? Lời khuyên nào? –

+0

Tôi sử dụng ReSharper và thông báo (chỉ cảnh báo) trạng thái * Trình khởi tạo trường tĩnh đề cập đến trường tĩnh bên dưới hoặc trong phần khác *. Vì vậy, bạn có thể muốn xem xét sử dụng một công cụ phân tích mã chứ? Ngoài ra, biến của bạn được xác định trong phạm vi chính xác, nó chỉ là không được khởi tạo vào thời điểm đó. –

+0

Một giải pháp hiển nhiên là khai báo mảng chuỗi dưới dạng thuộc tính: chuỗi tĩnh công khai [] SomeAmazingConsts {get {return new string [] {Const1}; }} Nhưng có ok không? –

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