2009-05-20 29 views
5

Trong .NET tính có nghĩa vụ phải là công dân hạng nhất tuy nhiên trong IL getters sở hữu mã và setters được thực hiện như get_PropertyNameset_PropertyName.Tại sao các nhà định cư bất động sản và getters đụng độ với các phương thức get_X và set_X?

class Property 
{ 
    int Value { get { return 42; } } 
    int get_Value() { return 6 * 9; } 
    void set_Value(int i) { } // Error even though Value is a read only property 
} 

Output:

lỗi CS0082: Loại 'SO.Property' đã bảo lưu một thành viên gọi là 'get_Value' với các loại cùng một tham số

lỗi CS0082: Loại 'SO. Thuộc tính 'đã dự trữ thành viên có tên' set_Value 'có cùng các loại thông số

Tại sao igners of .NET quyết định sử dụng tên có thể xung đột với mã người dùng? Họ có thể đã sử dụng một nhân vật bất hợp pháp (như Java sử dụng $ cho nội dung lớp học).

+6

Các định dạng get_Value() và set_Value() cũng đi ngược lại C# Quy ước đặt tên (http://msdn.microsoft.com/en-us/library/ms229045.aspx): "Không sử dụng dấu gạch dưới, dấu gạch nối hoặc bất kỳ ký tự không phải số nào khác. " Có thể chính xác là do vấn đề này, nhưng quan điểm là bạn không nên sử dụng định dạng này trong mã C# của bạn. – alastairs

Trả lời

8

Đối với các ngôn ngữ không có khái niệm về thuộc tính, chẳng hạn như J # (có thể ảnh hưởng rất lớn đến quyết định thiết kế đó), vẫn cần phải có tên đơn giản để gọi chúng.

1

Câu hỏi hay - hầu hết các thành viên do trình biên dịch tạo (các kiểu và phương thức ẩn danh) sử dụng các tên được đảm bảo không xung đột với bất kỳ thành viên nào trong lớp của bạn. Tôi nghĩ rằng trường hợp cụ thể này (cũng như các tên được tạo cho các phương thức sự kiện) là một trường hợp mà Microsoft đã gây ra một chút sai lầm. Lý do duy nhất tôi có thể nghĩ rằng điều đó sẽ biện minh cho quyết định là Microsoft có thể đã hy vọng cho phép các ngôn ngữ khác gọi những phương thức này mà bản thân họ không có khái niệm hoặc cú pháp "tài sản".

+1

không phải là một sai lầm, nó đã được cố ý. Điều này thực sự làm cho nó dễ dàng hơn cho các ngôn ngữ không hỗ trợ các khái niệm về tài sản để gọi cho họ, nó cũng làm cho nó dễ dàng để có được gettor hoặc settor bằng cách phản ánh. – Abel

2

Vì chúng có thể cần phải được gọi từ mã bên ngoài.

+0

Bên ngoài CLR ??? – Motti

+1

Không, "bên ngoài" với C# - xem câu trả lời Jb Evains –

7

Common Language Specification (CLS) yêu cầu sử dụng phương thức get_ và set_ trong IL (được trang trí bằng các bit đặc biệt) khi triển khai Thuộc tính. Điều này là cần thiết để các trình biên dịch khác nhau (C#, được quản lý C++, VB.NET, J #, IronPython, v.v.) tạo các bytecode tương thích.

Vì vậy, dấu gạch dưới không phải là ký tự "hợp pháp" theo nghĩa rộng hơn. Chúng không tuân thủ CLS và do đó không nên được sử dụng trong các giao diện không riêng tư.

Ngoài ra, hãy xem bài viết này về writing CLS-compliant code trên MSDN.

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