2009-03-14 41 views
12

Truy cập C# nội tuyến có thuộc tính không? Tôi nhận thức được giới hạn 32 byte (hướng dẫn?) Trên JIT cho nội tuyến, nhưng nó sẽ thuộc tính nội tuyến hoặc chỉ gọi phương thức thuần túy?Có thuộc tính nội tuyến C# không?

Trả lời

24

Tính đến JIT (trình biên dịch C# không thực hiện bất kỳ nội tuyến nào theo như tôi biết), nhưng tôi tin rằng JIT sẽ thuộc tính tầm thường trong hầu hết các trường hợp.

Lưu ý rằng nó sẽ không thành viên nội tuyến loại bắt nguồn từ MarshalByRefObject bao gồm System.Windows.Forms.Control (qua System.ComponentModel.Component).

Tôi cũng thấy các trường double kết thúc kém hiệu quả hơn khi được truy cập thông qua các thuộc tính - có thể có một số sự tinh tế xung quanh (do đăng ký sử dụng, v.v.).

Cũng lưu ý rằng các JIT 64 bit và 32 bit khác nhau, bao gồm cả việc xử lý những gì được gạch chân.

EDIT: Tôi vừa tìm thấy một 2004 blog entry bởi David Notario với một số thông tin khác. Tuy nhiên, đó là trước khi vận chuyển 2.0 - Tôi sẽ không ngạc nhiên khi thấy rằng ít nhất một số của nó đã thay đổi ngay bây giờ. Có thể được quan tâm anyway.

EDIT: Another question được gọi là 2008 Vance Morrison blog entry cung cấp thêm thông tin. Công cụ thú vị.

+0

Đáng chú ý là thuộc tính là trình bao bọc xung quanh một hoặc hai hàm get_Name, set_Name. Vì vậy, thuộc tính nội tuyến là một phần mở rộng tối thiểu trên chức năng nội tuyến. – Richard

8

Quyền truy cập thuộc tính chỉ là cuộc gọi phương thức thuần túy. Không có sự khác biệt trong IL trình biên dịch phát ra cho một truy cập tài sản và cho một cuộc gọi phương thức với một chữ ký tương tự, mà loại câu trả lời câu hỏi của bạn.

+0

Trong khi tôi đồng ý với nguyên tắc chung, có * là sự khác biệt về IL ở phía * thuộc tính * JIT có thể "biết" rằng những gì được gọi là thành viên bất động sản, vì vậy * có thể * quyết định không JIT dựa trên thông tin đó. Nó sẽ là khá kỳ lạ để làm như vậy mặc dù, IMO. –

+0

Có, các phương thức truy cập được đánh dấu bằng cờ 'specialname' và tên của chúng được chuẩn hóa.OTOH, các phương thức được điều trị đặc biệt từ CLR (giống như các hàm tạo) được đánh dấu bằng 'rtspecialname', do đó việc xử lý các trình truy cập khác nhau sẽ trái ngược với tinh thần của chuẩn CLI/CLR. –

5

Tôi mất một lúc để hiểu rằng trong Visual Studio bạn có thể xem việc tháo gỡ mã được quản lý, sau JIT biên dịch nó. Vì vậy, tại sao không tạo ra một lớp học với một thuộc tính accessor rất đơn giản, chạy nó trong chế độ phát hành, thiết lập một breakpoint, và xem những gì disassembly nói?

+3

Tại sao bạn không cho chúng tôi biết làm thế nào để làm điều đó nếu (như bạn nói) đã đưa bạn một thời gian để tìm ra điều đó? –

+0

Chỉ cần bước hoặc đột nhập vào mã và mở cửa sổ Tháo gỡ. –

+6

Nếu bạn chạy mã chế độ phát hành bên dưới trình gỡ lỗi, hãy chạy nó dưới trình gỡ lỗi có khả năng vô hiệu hóa tối ưu hóa JIT! Thay vào đó bạn cần phải khởi động nó mà không có trình gỡ rối, hãy để nó JIT, và sau đó sử dụng trình gỡ rối để đính kèm vào tiến trình đã chạy (và * sau đó * mở cửa sổ tháo gỡ). – ChrisW

4

tôi đăng một câu hỏi tương tự gần đây:

Why are public fields faster than properties?

Vấn đề với tôi là một lĩnh vực nào là nhanh hơn so với một tài sản bởi vì tôi đang chạy 64-bit Vista và JIT biên soạn mã của tôi để 64-bit là tốt, và tài sản của tôi là không in-lót. Buộc các dự án biên dịch cho x86 đã làm trong dòng bất động sản và không có sự khác biệt tốc độ giữa tài sản và lĩnh vực công cộng.

Vì vậy, C# 32 bit JIT thực hiện các thuộc tính nội tuyến, 64 bit không có hoặc bất kỳ phương thức không tĩnh nào khác.

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