2010-09-06 79 views
5

Giả sử tôi khởi tạo các thành viên của một lớp học như thế này:Trong C#, là một hàm tạo mặc định được tạo ra khi các thành viên lớp được khởi tạo?

class A 
{ 
    public int i=4; 
    public double j=6.0; 
} 

Liệu trình biên dịch tạo một constructor mặc định trong tình huống này?

Nói chung, tôi biết rằng một hàm tạo có thể khởi tạo giá trị của các biến cá thể lớp và cũng có thể thực hiện một số hoạt động khởi tạo khác phù hợp với lớp đó. Nhưng trong ví dụ trên, tôi đã khởi tạo giá trị của ij bên ngoài một hàm tạo. Trong tình huống này, trình biên dịch vẫn tạo ra một hàm tạo mặc định? Nếu vậy, constructor mặc định làm gì?

+0

Tôi đã chỉnh sửa đáng kể câu hỏi của bạn để làm rõ những gì tôi nghĩ bạn đang cố hỏi và có khả năng mang lại nhiều sự chú ý hơn cho nó. Nếu tôi đã đánh giá sai mục đích của bạn, vui lòng quay lại bản chỉnh sửa của tôi hoặc chỉnh sửa thêm. – DavidRR

Trả lời

11

Trình biên dịch vẫn tạo ra một hàm tạo mặc định trong trường hợp này. Hàm khởi tạo xử lý khởi tạo của i và j. Nếu bạn nhìn vào IL, điều này là hiển nhiên.

.class auto ansi nested private beforefieldinit A 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
     .maxstack 8 
     L_0000: ldarg.0 // pushes "this" onto the stack 
     L_0001: ldc.i4.4 // pushes 4 (as Int32) onto the stack 
     L_0002: stfld int32 TestApp.Program/A::i // assigns to i (this.i=4) 
     L_0007: ldarg.0 // pushes "this" onto the stack 
     L_0008: ldc.r8 6 // pushes 6 (as Double) onto the stack 
     L_0011: stfld float64 TestApp.Program/A::j // assigns to j (this.j=6.0) 
     L_0016: ldarg.0 // pushes "this" onto the stack 
     L_0017: call instance void [mscorlib]System.Object::.ctor() // calls the base-ctor 
     /* if you had a custom constructor, the body would go here */ 
     L_001c: ret // and back we go 
    } 
+2

Được chú thích cho OP; hy vọng đó là OK –

+0

Cảm ơn Marc. Ý tưởng tốt. –

0

biến thể khởi tạo bạn có ở trên sẽ được chạy trước tiên. Sau đó, bất cứ điều gì bạn có trong constructor của bạn sẽ được chạy sau.

3

Bạn có thể đọc những điều này trong official ECMA language standard. Chương 17.4.5 nói về vấn đề cụ thể này, về cơ bản nói rằng các trường sẽ được khởi tạo mặc định với bất kỳ giá trị mặc định nào có (0 hoặc 0.0, trong trường hợp của bạn), và sau đó khởi tạo giá trị sẽ được thực thi theo thứ tự chúng được khai báo trong tệp nguồn.

+0

+1 để tham chiếu đến đặc điểm kỹ thuật tiêu chuẩn – jgauffin

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