Trong C#, một constructor chạy trình tự:
Perform all field initializers
Chain to base class constructor
Execute user-supplied code for constructor
Trong vb.net, trình tự là:
Chain to base class constructor
Perform all field initializers
Execute user-supplied code for constructor
Không có khung-bas lý do tại sao C# thực hiện mọi thứ theo thứ tự mà nó thực hiện, bằng chứng là vb.net có thể thực hiện và thực hiện chúng theo một trình tự khác. Sự biện minh thiết kế cho phương pháp C# là không có khả năng một đối tượng nào được tiếp xúc với thế giới bên ngoài trước khi tất cả các khởi tạo trường (cho các trường dẫn xuất cũng như các lớp cơ sở) đã chạy; vì một hàm tạo lớp cơ sở có thể phơi bày một đối tượng với thế giới bên ngoài, thực thi yêu cầu đó có nghĩa là các trình khởi tạo trường phải chạy trước hàm tạo lớp cơ sở.
Cá nhân, tôi không thấy rằng lý giải đặc biệt thuyết phục. Có rất nhiều kịch bản mà trong đó nó sẽ không thể đặt trường thành các giá trị hữu ích mà không có thông tin sẽ không có sẵn trước khi hàm tạo cơ sở đã chạy. Bất kỳ mã nào có hàm tạo cơ sở có thể trưng ra các cá thể được xây dựng một phần cần được chuẩn bị cho khả năng đó. Mặc dù có những lúc hữu ích khi chỉ định rằng trình khởi chạy trường sẽ chạy "sớm", tôi nghĩ có nhiều tình huống hơn khi chúng hữu ích để chúng có thể truy cập đối tượng non trẻ (trong một số biện pháp vì tôi tin rằng các trường lớp có các giá trị cần được coi là các bất biến trong suốt vòng đời của một cá thể lớp nên khi thiết thực được thiết lập một cách khai báo thông qua các khởi tạo hơn là bắt buộc trong một hàm tạo).
Ngẫu nhiên, một tính năng tôi muốn xem trong cả vb.net và C# sẽ là phương tiện khai báo trường được khởi tạo tham số và trường giả. Nếu một lớp có trường tham số được khởi tạo của một tên và kiểu nhất định, mọi hàm tạo cho lớp đó không có chuỗi khác trong cùng một lớp phải chứa các tham số có tên và kiểu thích hợp. Các giá trị của các trường đó sẽ được đặt trong hàm tạo trước khi bất kỳ điều gì khác được thực hiện và sẽ có thể truy cập được vào các trình khởi tạo trường khác. Các trường giả sẽ hoạt động giống như các trường, ngoại trừ việc chúng sẽ chỉ có thể sử dụng trong các trình khởi tạo trường và sẽ được triển khai dưới dạng các biến cục bộ trong các hàm tạo. Một tính năng như vậy sẽ làm cho nhiều loại cấu trúc thuận tiện hơn. Ví dụ, nếu một loại là nghĩa vụ phải giữ một ví dụ mảng đặc biệt trong suốt cuộc đời của mình, có thể nói:
readonly param int Length;
readonly ThingType[] myArray = new ThingType[Length];
dường như đẹp hơn vì phải hoặc xây dựng các mảng trong constructor lớp (trong đó không thể xảy ra cho đến sau khi hàm tạo cơ sở đã chạy) hoặc (cho vb.net) phải truyền độ dài cho hàm tạo lớp cơ sở, sau đó có thể sử dụng nó để thiết lập trường (sau đó chiếm không gian trong lớp ngay cả khi giá trị của nó-- như Length
ở trên - có thể không cần thiết).
Không, lý do mà nó không biên dịch không phải là ở tất cả các 'Identity' là trong lớp cơ sở, nó chỉ đơn giản bởi vì nó là một thành viên cá thể. Vì vậy, câu hỏi trong tiêu đề không liên quan đến những gì bạn đang cố gắng làm ... – Guffa