2011-02-14 43 views
5

Tôi đang cố gắng để hiểu khi các lĩnh vực chính xác tĩnh đi vào sự tồn tại và đã được đọc bài viết này MSDN - http://msdn.microsoft.com/en-us/library/79b3xss3 - nhưng có vẻ như mâu thuẫn với bản thân:Khi nào các trường tĩnh xuất hiện?

Đầu tiên nó nói:

thành viên tĩnh được khởi tạo trước khi thành viên tĩnh được truy cập lần đầu tiên và trước hàm dựng tĩnh, nếu có, được gọi.

Nhưng sau đó nó tiếp tục nói:

Nếu lớp học của bạn chứa các lĩnh vực tĩnh, cung cấp một constructor tĩnh khởi chúng khi lớp được nạp.

Vì vậy, câu hỏi của tôi về cơ bản là: Khi nào các trường tĩnh thực sự được khởi tạo và khi nào chúng bắt đầu tồn tại? Là nó trước khi constructor tĩnh được gọi là, trong hoặc sau?

Rất cám ơn!

+5

Vâng, khi một trường Mommy và một trường Daddy yêu nhau rất nhiều ... –

+0

Nó là đáng ngạc nhiên phức tạp. Xem bài viết của Jon về chủ đề để biết chi tiết: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx –

Trả lời

7

C bang đặc điểm kỹ thuật # Ngôn ngữ (trong 10.5.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 một hàm tạo tĩnh (§10.12) tồn tại trong lớp, việc thực thi các trình khởi tạo trường tĩnh xảy ra ngay lập tức trước khi thực hiện hàm tạo tĩnh đó. Nếu không, các trình khởi tạo trường tĩnh được thực hiện tại thời điểm phụ thuộc thực hiện trước khi sử dụng lần đầu tiên của một trường tĩnh của lớp đó

Tôi tin rằng hướng dẫn trong dòng thứ hai của bạn thực sự là khởi tạo các trường tĩnh không được thực hiện nội tuyến, sử dụng trình khởi tạo trường. Trong trường hợp đó, bạn nên sử dụng một hàm tạo tĩnh để đảm bảo rằng chúng sẽ được khởi tạo trước khi sử dụng.

Như bạn có thể thấy từ đặc điểm kỹ thuật, "thời gian" thực tế mà chúng tồn tại là thực hiện cụ thể và có thể thay đổi. Sự bảo đảm duy nhất là chúng sẽ tồn tại trước khi constructor tĩnh được gọi, mà sẽ luôn luôn xảy ra trước khi sử dụng chúng trong mã. đặc điểm kỹ thuật này bang (ở 10,12):

Việc thực hiện một constructor tĩnh được kích hoạt bởi các đầu tiên của sự kiện sau đây xảy ra trong một miền ứng dụng:

· Một thể hiện của kiểu lớp được tạo ra.

· Bất kỳ thành viên tĩnh nào của loại lớp đều được tham chiếu.

+0

Cảm ơn rất nhiều :-) –

1

Trường tĩnh được đảm bảo được khởi tạo trước khi sử dụng lần đầu tiên của lớp.

Tùy chọn, bạn có thể cung cấp một hàm tạo tĩnh để kiểm soát khởi tạo tĩnh tại thời điểm nó xảy ra.

2

Giống như trường "bình thường". Vì vậy, trước khi xây dựng tĩnh. Bạn có thể kiểm tra bằng một chương trình rất đơn giản.

Trình tự là:

  • lĩnh vực tĩnh
  • constructor tĩnh
  • lĩnh vực "bình thường"
  • "bình thường" constructor

Một chương trình mẫu:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Start"); 
     int b = A.B; 
     Console.WriteLine("Read A.B"); 
     new A(); 
     Console.WriteLine("Built A"); 
    } 
} 

class A 
{ 
    public static int B = mystaticfunc(); 

    static int mystaticfunc() { 
     Console.WriteLine("Static field"); 
     return 1; 
    } 

    static A() 
    { 
     Console.WriteLine("Static constructor"); 
    } 

    int C = myfunc(); 

    static int myfunc() 
    { 
     Console.WriteLine("Field"); 
     return 1; 
    } 

    public A() 
    { 
     Console.WriteLine("Constructor"); 
    } 
} 

Output:

Start 
Static field 
Static constructor 
Read A.B 
Field 
Constructor 
Built A 
1

Các CLR không có khái niệm riêng của tĩnh thành viên khởiconstructor tĩnh. Thay vào đó, chỉ có một bộ khởi tạo loại duy nhất.

Trình biên dịch C# viết kiểu khởi tạo cho bạn, trước tiên nó khởi tạo thành viên tĩnh, sau đó bao gồm mã của bạn từ bất kỳ hàm tạo tĩnh nào bạn đã xác định.

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