Tôi rất vui vì C# không cho phép bạn truy cập các thành viên tĩnh như thể họ là thành viên cá thể. Điều này tránh một lỗi phổ biến trong Java:Tại sao lại hữu ích khi truy cập các thành viên tĩnh "thông qua" các kiểu kế thừa?
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
Mặt khác, nó không phép bạn truy cập các thành viên tĩnh 'qua' loại có nguồn gốc. Khác với các nhà khai thác (nơi nó giúp bạn tiết kiệm từ viết phôi), tôi không thể nghĩ ra bất kỳ trường hợp nào điều này thực sự hữu ích. Trong thực tế, nó tích cực khuyến khích sai lầm như:
// Nasty surprises ahead - won't throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");
// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
Cá nhân tôi giữ cam kết lỗi tương tự hơn và hơn khi tôi đang tìm cách của mình thông qua các API không quen thuộc (Tôi nhớ bắt đầu với cây biểu thức; tôi nhấn BinaryExpression.
trong trình soạn thảo và tự hỏi tại sao IntelliSense lại cung cấp cho tôi MakeUnary
làm tùy chọn).
In (thiển cận) tôi ý kiến, tính năng này:
- Không giảm tính cách rườm rà; lập trình viên phải chỉ định một tên kiểu một cách này hay cách khác (trừ các toán tử và các trường hợp khi một người đang truy cập các thành viên tĩnh kế thừa của kiểu hiện hành).
- Khuyến khích các lỗi/mã gây hiểu lầm như mã ở trên.
- Có thể đề xuất với lập trình viên rằng các phương pháp tĩnh trong C# thể hiện một số loại 'đa hình', khi chúng không.
- (Dân tộc thiểu số) Giới thiệu các khả năng hồi phục không thể mong đợi khi biên dịch lại.
(IMO, các nhà khai thác là một trường hợp đặc biệt mà bảo đảm cuộc thảo luận riêng của họ.)
Cho rằng C# là bình thường một "hố của thành công" ngôn ngữ, tại sao tính năng này tồn tại? Tôi không thể thấy các lợi ích của nó (ngoài 'khả năng phát hiện', mà có thể luôn được giải quyết trong IDE), nhưng tôi thấy rất nhiều vấn đề.
Hoặc, tệ hơn, 'UTF8Encoding.ASCII'. – SLaks
Tôi đồng ý rằng nó có thể hơi gây nhầm lẫn, nhưng nó phù hợp với nguyên tắc mà * các thành viên được thừa kế được coi là thành viên của loại có nguồn gốc *.Lưu ý rằng chúng tôi rõ ràng * không * cho phép mẫu này trên các thông số loại bị ràng buộc bởi vì sau đó nó thực sự có khả năng khá gây hiểu lầm. Xem http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx để biết chi tiết. –