2009-09-29 27 views
38

cho đoạn mã sau:Khởi Order of tĩnh Fields trong tĩnh Lớp

public static class Helpers 
{ 
    private static Char[] myChars = new Char[] {'a', 'b'}; 

    private static Int32 myCharsSize = myChars.Length; 
} 

Có đảm bảo rằng myChars sẽ được khởi trước tôi sử dụng chiều dài của nó để gán cho myCharsSize?

Trả lời

43

Vâng, họ sẽ, vui lòng xem 10.4.5.1 Static field initialization:

Trường tĩnh initializers biến 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 đó chúng xuất hiện trong tuyên bố lớp học. Nếu static constructor (Mục 10.11) tồn tại trong lớp, thực thi static trường khởi tạo tĩnh xảy ra ngay lập tức trước khi thực thi static constructor đó. Nếu không, bộ khởi tạo trường tĩnh được thực thi tại thời điểm phụ thuộc thời gian thực hiện trước lần đầu tiên sử dụng trường tĩnh là lớp đó.

Điều đó đang được nói rằng tôi nghĩ sẽ tốt hơn nếu thực hiện khởi tạo bên trong trình khởi tạo kiểu tĩnh (hàm tạo tĩnh).

+3

Chăm sóc trích dẫn bằng chứng? –

+2

Tốt hơn nhiều ;-p –

+0

@Marc - LOL, tôi đã đăng "có" vì vậy tôi sẽ là người đầu tiên và sau đó quay trở lại với bằng chứng. Vì tôi không còn là FGTW nữa nên tôi không nên lo lắng về việc đầu tiên nữa: D –

11

Hmm ... Tôi rất ngạc nhiên khi biên dịch (có, tôi đã kiểm tra). Tôi không biết về bất kỳ sự bảo đảm nào sẽ làm cho điều này an toàn. Sử dụng một hàm tạo tĩnh ...


Chỉnh sửa: Tôi chấp nhận (xem better answer above) rằng nó sẽ hoạt động; nhưng ý tưởng của tôi với mã là giữ nó đơn giản và rõ ràng nhất có thể. Nếu nó không phải là rõ ràng rằng nó sẽ hoạt động (và nó không thể được nếu bạn có yêu cầu), sau đó không viết nó theo cách đó ...

Cụ thể, các vấn đề dựa vào thứ tự trường :

  • nó có thể phá vỡ nếu bạn di chuyển mã xung quanh (mà tôi thường làm)
  • nó có thể phá vỡ nếu bạn chia mã vào partial lớp

Lời khuyên của tôi vẫn là: sử dụng một constructor tĩnh cho kịch bản này.

+1

+1 Lời khuyên này là âm thanh - chỉ vì bạn _can_ làm điều gì đó không có nghĩa là bạn nên làm. Tôi nghĩ rằng một constructor tĩnh là cách để đi ở đây mặc dù ngôn ngữ không hỗ trợ kiểu khởi tạo trường này. –

+0

Mặc dù bạn có thể viết nhiều mã ngắn gọn hơn với thuộc tính tĩnh/trường khởi tạo (gõ tên thuộc tính một lần cho mỗi thuộc tính thay vì hai lần — một lần trong định nghĩa và một lần trong hàm khởi tạo tĩnh). Trong một số trường hợp, điều này có thể là sự khác biệt giữa tệp nguồn phù hợp trên một màn hình hoặc yêu cầu cuộn để xem đầy đủ. Phụ thuộc vào mục tiêu của bạn. Nếu bạn muốn sắp xếp văn bản các thuộc tính theo thứ tự khác với thứ tự chúng cần được khởi tạo, thì, có, một hàm khởi tạo tĩnh được viết bằng tay là lựa chọn duy nhất của bạn. – binki

0

Thoạt nhìn, tôi sẽ không chắc chắn, và tôi phải thử điều này để xem liệu nó có được biên dịch hay không.

Cho rằng, tôi sẽ khởi tạo giá trị trong một hàm tạo tĩnh.