Почему полезен доступ к статическим членам «через» унаследованные типы? - PullRequest
18 голосов
/ 09 февраля 2011

Я рад, что C # не позволяет вам получать доступ к статическим элементам «как будто» они были членами экземпляра.Это позволяет избежать распространенной ошибки в Java:

Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.

С другой стороны, он делает , позволяющим вам получать доступ к статическим элементам через сквозные производные типы.Кроме операторов (где это спасает вас от написания приведений), я не могу вспомнить ни одного случая, когда это действительно полезно.На самом деле, он активно поощряет ошибки, такие как:

// 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);

Я лично продолжаю совершать подобные ошибки снова и снова, когда я ищу свой путь через незнакомые API (я помню, как начинал с деревьев выражений; я нажимал BinaryExpression. в редакторе и ему было интересно, почему IntelliSense предлагал мне MakeUnary в качестве опции).

По моему (близорукому) мнению, эта функция:

  1. Неуменьшить многословие;программист должен указать имя типа тем или иным образом (исключая операторы и случаи, когда кто-то обращается к унаследованным статическим членам текущего типа).
  2. Поощряет ошибки / вводящий в заблуждение код, такой как приведенный выше.
  3. Может предложить программисту, что статические методы в C # демонстрируют своего рода «полиморфизм», когда они этого не делают.
  4. (Незначительно) Вводит «тихие», возможно, непреднамеренные возможности повторного связывания при перекомпиляции.

(IMO, операторы - это особый случай, требующий собственного обсуждения.)

Учитывая, что C # обычно является языком «ямы успеха», почему эта функция существует?Я не вижу его преимуществ (кроме «обнаруживаемости», которую всегда можно решить в IDE), но вижу много проблем.

Ответы [ 2 ]

8 голосов
/ 09 февраля 2011

Я бы согласился, что это ошибка. Я не знаю, как часто кто-то в Stack Overflow размещал код:

ASCIIEncoding.ASCII

и т. Д., Которые, хотя и безопасны с точки зрения исполнения , вводят в заблуждение с точки зрения чтения кода.

Очевидно, что уже слишком поздно удалять эту "функцию", хотя я думаю, что команда C # могла бы ввести супер-подробный режим предупреждения для этой и других проблем со стилем.

Возможно, преемник C # улучшит ситуацию ...

2 голосов
/ 09 февраля 2011

Это полезно в WinForms.

В любом элементе управления или форме вы можете написать MousePosition, MouseButtons или ModifierKeys, чтобы использовать static членов, унаследованных от Control.

Это еще спорно, было ли это хорошее решение.

...