почему статический участник не может быть достигнут через имя экземпляра?

скажите, что я имею:

 class Test
 {
      public static int Hello = 5;
 }

Это, очевидно, работает:

 int j = Test.Hello;

Но почему это не должно работать?

 Test test = new Test();
 int j = test.Hello;

Экземпляру нельзя было назвать участника одинаково, таким образом, я не вижу, как это могло быть неоднозначно или неразрешимо для компилятора.

Кто-либо какая-либо идея, почему это?

Править: Есть ли какая-либо другая техническая причина, почему это должно отличаться от разработчиков языка, выбирающих это для удобочитаемости/ясности/эстетики/и т.д.?

6
задан Toad 19 March 2010 в 12:23
поделиться

5 ответов

Другой ракурс:

Предположим, это было возможным. Каким будет результат при доступе к статическому члену через переменную экземпляра, которая имеет значение null ? Хотели бы вы исключение нулевой ссылки (но почему, поскольку для получения статического члена не требуется экземпляр)? Или вы хотите, чтобы это сработало (в этом случае у вас может возникнуть странная ситуация, когда некоторые вызовы этой переменной экземпляра работают, а некоторые нет)? В любом случае есть проблемы.

14
ответ дан 8 December 2019 в 03:52
поделиться

Я думаю об этом как о защитном дизайне языка: если вы по ошибке объявите свойство статическим, а затем будете устанавливать/получать его от различных экземпляров, когда вы предполагали, что это свойство экземпляра, вы можете получить все виды злых побочных эффектов без каких-либо очевидных признаков того, что не так.

Требуя от разработчика использовать имя класса для доступа к статическому свойству, это дает понять, что оно не является свойством экземпляра, и требует от разработчика при кодировании четко понимать, что он действительно хочет получить к нему доступ как к статическому свойству.

1
ответ дан 8 December 2019 в 03:52
поделиться

"Есть ли какая-нибудь другая техническая причина, почему это должно быть ДРУГОЙ, кроме того, что разработчики языка выбрали это для удобочитаемости/четкости/эстетики/etc?"

Единственная другая причина, о которой я могу думать, это то, что это создает дополнительные препятствия для вашего компилятора (не то чтобы это было большой проблемой). Если бы вызовы статических методов могли быть доступны экземплярам, экземпляры должны были бы хранить все статические смещения или компилятор должен был бы выполнять дополнительный шаг, на котором он искал бы статический метод с той же сигнатурой в классе, когда он не смог найти нестатический метод в экземпляре.

1
ответ дан 8 December 2019 в 03:52
поделиться

Вы можете прочитать подробное объяснение статического ключевого слова в MSDN , но я думаю, что это лучше всего объясняется этой цитатой

Хотя экземпляр класса содержит отдельную копию всех полей экземпляра класса, есть только одна копия каждого статического поля.

Я считаю, что это может быть маршрутизировано в адресах памяти и смещениях, используемых компилятором. Из того, что я помню в моем курсе компилятора в школе, местоположение ваших переменных экземпляра будет сохранено как смещение от первого места в памяти, где хранится объект.Поскольку существует только одна копия статического поля, для доступа к значению статического поля никогда не будет фиксированного смещения.

Что касается двусмысленности имен, это может быть так же просто, как конфликт имен внутри чего-то вроде таблицы символов. Однако можно было бы легко рассмотреть более глубокие технические аспекты.

0
ответ дан 8 December 2019 в 03:52
поделиться

Помните, что такое статические методы (или свойства, или поля): Они принадлежат классу, а не какому-либо конкретному экземпляру этого класса. Поэтому они являются общими для всех экземпляров.

Поэтому вполне логично, что доступ к статическим членам должен осуществляться через имя класса, а не через объект. Совершенно верно, что язык C# мог быть спроектирован иначе в этом отношении... но это не так.

11
ответ дан 8 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: