2012-08-08 43 views
10

Với các lớp học sau:Tại sao một constructor tĩnh được gọi trên một lớp được sử dụng như một tham số kiểu generic?

public class Foo { 
    static Foo() { 
     Console.WriteLine("Foo is being constructed"); 
    } 
} 

public class Bar { 
    public void ReferenceFooAsGenericTypeParameter<T>() { 
     Console.WriteLine("Foo is being referenced as a generic type parameter"); 
    } 
} 

public class SampleClass 
{ 
    public static void Main() 
    { 
     new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); 
    } 
} 

Đầu ra là

Foo is being referenced as a generic type parameter

này có ý nghĩa, theo spec:

Một constructor tĩnh được gọi tự động để khởi tạo lớp trước ví dụ đầu tiên được tạo hoặc bất kỳ thành viên tĩnh nào được tham chiếu.

Nhưng tôi tò mò tại sao hàm tạo tĩnh không được gọi khi kiểu được tham chiếu dưới dạng tham số kiểu chung.

+0

Đối tác câu hỏi tốt, điều này một chút tôi hôm nay –

Trả lời

6

Tại sao cần phải như vậy?

Điểm của hàm tạo tĩnh được gọi là bình thường là đảm bảo rằng bất kỳ trạng thái nào được thiết lập trong hàm dựng tĩnh được khởi tạo trước khi nó được sử dụng lần đầu tiên.

Chỉ cần sử dụng Foo làm đối số kiểu không sử dụng bất kỳ trạng thái nào bên trong nó, vì vậy không cần phải gọi hàm dựng tĩnh.

Bạn có thể thử tạo bộ khởi tạo biến tĩnh với các hiệu ứng phụ (ví dụ: gọi phương thức rồi in trên bảng điều khiển) và xóa hàm tạo tĩnh - can affect the timing of initialization significantly trong một số trường hợp. Nó có thể kích hoạt tại đây.

+0

Tôi đã tìm được nhiều. Cảm ơn bạn đã làm rõ và liên kết. – arootbeer

1

Đó là vì bạn không thể sử dụng nội dung kiểu theo bất kỳ cách nào có ý nghĩa bằng cách thêm vào như một tham số kiểu chung, kiểu cần phải thực hiện một điều gì đó để đảm bảo một hàm dựng tĩnh được gọi.

Và bạn chính xác rằng điều này phù hợp với đặc điểm kỹ thuật. Mục 10.12 (Static Constructors) khẳng định:

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 là tạo.

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

Sử dụng làm thông số loại chung chung không thuộc loại này.

+0

Câu hỏi đã thừa nhận rằng hành vi này theo thông số kỹ thuật, nhưng hỏi tại sao thông số được viết theo cách đó. – hvd

+0

@hvd Cảm ơn bạn đã bỏ lỡ điều đó. Đã thay đổi câu trả lời. –

0

Những điều cần lưu ý ở đây là trong new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); bạn đã tạo ra một đối tượng kiểu Bar, không chính cũng không Bar của bạn có tạo ra một thể hiện của Foo cũng không có bất kỳ của các thành viên của nó được truy cập, trong trường hợp trình bày, loại chính nó chỉ được thông qua như một param.

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