2010-11-21 49 views
6

Tôi sẽ xem qua một số hướng dẫn C# nêu rõ:Tạo đối tượng trong câu hỏi C#

"Sau khi tìm thấy lớp thuộc tính, trình biên dịch sẽ kiểm tra xem thuộc tính có được phép trên lớp hay không. Nếu nó tìm thấy một, nó tạo ra một thể hiện của đối tượng bằng cách gọi hàm tạo với các giá trị được chỉ định "

Tên của đoạn này là" quá trình biên dịch ", và nó đề cập đến cách trình biên dịch xử lý các thuộc tính. Tôi xin lỗi vì sự thiếu hiểu biết, nhưng các trường hợp không nên được tạo ra trong thời gian chạy?

Cảm ơn.

+2

Tìm kiếm báo giá đó trả về chính xác 1 kết quả: câu hỏi này. Bạn đã có được nó từ đâu? – dtb

+0

Có vẻ như trình biên dịch ở đây đang được sử dụng như một từ đồng nghĩa cho "mã trình biên dịch tạo ra". – Hogan

Trả lời

3

Thuộc tính xác định siêu dữ liệu cho lớp - mọi phiên bản của lớp (tức là đối tượng) sẽ chia sẻ cùng một giá trị thuộc tính. Siêu dữ liệu này được lưu trữ cùng với định nghĩa loại, được tính một lần tại thời gian biên dịch từ các tệp nguồn.

1

Có quy trình "biên dịch" tạo mã trung gian được diễn giải bằng .NET framework.

Đó là lý do tại sao họ đang nói về quá trình biên dịch.

2

Vì có các thuộc tính cũng là affect the compiler, tôi sẽ không ngạc nhiên nếu trình biên dịch làm khởi tạo chúng khi biên dịch. Vậy cái gì?

+0

Tôi không biết rằng trình biên dịch instantiates đối tượng. – user429400

+1

Nghe có vẻ khó xảy ra. Tôi nghi ngờ rằng trình biên dịch instantiates thuộc tính (tức là nó gọi constructor của một thuộc tính do người dùng định nghĩa). – CodesInChaos

+0

làm thế nào một trình biên dịch sẽ khởi tạo một đối tượng? – miguel

0

Trình biên dịch chỉ tạo siêu dữ liệu mô tả việc xây dựng thuộc tính và gán cho thuộc tính của nó. Thuộc tính chính nó chỉ được khởi tạo tại thời điểm bạn sử dụng sự phản chiếu để liệt kê các thuộc tính. Tôi nghĩ mỗi lời gọi phản chiếu sẽ tạo ra một thể hiện mới của thuộc tính đó.

Và tôi nghĩ rằng có một cách (liên quan đến phản ánh chỉ bối cảnh) để kiểm tra thuộc tính trực tiếp từ meta mà không cần instantiating nó cả.