2014-05-13 13 views
6

của Microsoft trên C# Coding Conventions (C# Programming Guide) một cách rõ ràng rằng:Tại sao "Không truy cập một thành viên tĩnh được định nghĩa trong một lớp cơ sở từ một lớp dẫn xuất." Điều

"Đừng truy cập vào một thành viên tĩnh được định nghĩa trong một lớp cơ sở từ lớp dẫn xuất ."

Tại sao bạn không nên truy cập thành viên tĩnh?

Dường như có các trường hợp hợp lệ trong đó điều này sẽ xảy ra, ví dụ: tất cả các thành viên const đều tĩnh. Nên các lớp dẫn xuất không bao giờ có thể đọc một thành viên const được định nghĩa trong lớp cơ sở?

+0

Hãy xem câu hỏi này: [Tránh "Truy cập vào một thành viên tĩnh của một loại thông qua một loại có nguồn gốc"] (http://stackoverflow.com/questions/4405953/avoiding-access-to-a-static- thành viên-of-a-kiểu-via-a-nguồn gốc-loại? rq = 1) –

Trả lời

6

Hãy sử dụng object.ReferenceEquals làm ví dụ. Dưới đây là một vài cách bạn có thể gọi phương pháp này từ một lớp học có nguồn gốc:

class A { 
A() { 
    ReferenceEquals("a", "b"); //your warning is based on this style 
    object.ReferenceEquals("a", "b"); //recommended style 
} 
} 

Thực tế là ReferenceEquals có thể truy cập trong A chỉ là một trùng hợp ngẫu nhiên. Một phương thức tĩnh độc lập với bất kỳ phân cấp thừa kế nào. Do đó, luôn gọi nó là đủ điều kiện từ bất cứ đâu.

Cảnh báo này chỉ mang tính phong cách và rõ ràng. Tất cả các biến thể tôi đã biên dịch cho cùng một IL.

Một cách giải thích khác là bạn đang lạm dụng thừa kế để rút ngắn cú pháp được sử dụng để gọi phương thức. Đây là một sự lạm dụng thừa kế. ASP.NET MVC thực hiện điều này với lớp cơ sở Controller. Nó cho phép bạn viết return View();. Nó sử dụng thừa kế để làm cho một tập hợp các phương thức thuận tiện có sẵn.

+0

Hai đầu tiên của bạn (truy cập nó như một phương pháp dụ) không biên dịch trong C#; có lẽ bạn đang nghĩ Java? –

+0

@TimS. thực sự, đó là Java. Cảm ơn. – usr

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