Только недавно я обнаружил, что и Java, и C # не поддерживают отображение локальных переменных. Например, вы не можете получить имена локальных переменных во время выполнения.
Несмотря на то, что эта оптимизация имеет смысл, мне любопытно, поддерживают ли текущие языки полное и полное отражение всех объявлений и конструкций.
РЕДАКТИРОВАТЬ: Я уточню мой пример "имена локальных переменных" немного дальше.
В C # вы можете выводить имена параметров в методы, используя отражение:
foreach(ParameterInfo pi in typeof(AClass).GetMethods()[0].GetParameters())
Trace.WriteLine(pi.Name);
Вам не нужно знать имена параметров (или даже метода) - все это содержится в информации об отражении. На полностью рефлексивном языке вы могли бы сделать:
foreach(LocalVariableInfo lvi in typeof(AClass).GetMethods()[0].GetLocals())
Trace.WriteLine(lvi.Name);
Приложения могут быть ограничены (многие приложения рефлексии есть), но, тем не менее, я ожидаю, что язык с полной рефлексией будет поддерживать такую конструкцию.
РЕДАКТИРОВАТЬ : Поскольку два человека теперь фактически сказали: «Нет смысла отражать имена локальных переменных», вот основной пример того, почему это полезно:
void someMethod()
{
SomeObject x = SomeMethodCall();
// do lots of stuff with x
// sometime later...
if (!x.StateIsValid)
throw new SomeException(String.Format("{0} is not valid.", nameof(x));
}
Конечно, я мог бы просто жестко закодировать "x" в строке, но правильная поддержка рефакторинга делает это большим нет-нет. nameof(x)
или возможность отображать все имена - хорошая функция, которая в настоящее время отсутствует.