2012-02-02 6 views
7

Я заметил кое-что любопытное, когда возился с вложенными классами и выводил имя типа в окно консоли. Мне было интересно, может ли кто-нибудь объяснить это мне. При вызове GetType() в основном классе он возвращает то, что я ожидал бы, это было имя класса после соответствующих пространств имен. т.е. Namespace.Namespace.ClassnameВложенный класс .GetType()

Однако, когда я вызываю функцию из класса ограждающей вернуть тип вложенного класса я получаю возвращенное значение, как это:

Namespace.Namespace.ClassNameEnclosing + ClassNameNested. 

Почему это не просто возвращается в виде точечной нотации , Почему символ +? Мне просто интересно, что происходит на заднем плане, что вызывает эту нотацию.

ответ

5

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

Я не могу сказать из рук в руки (из краткого изучения ECMA-335), было ли безоговорочное название типа, которое включало точку, действительно было бы действительным в IL; I подозреваемого это было бы, но это сделало бы все виды диагностики труднее читать.

+0

Спасибо за ответ. Я вижу, что, хотя класс является классом по своему усмотрению, у него нет собственного пространства имен? Символ «плюс» в основном утверждает, что этот тип является дополнением к пространству имен охватывающего класса? – CSharpened

+0

@CSharpened: Да, это его пространство имен - если вы посмотрите на пространство имен (скажем) 'System.Collections.Generic.SortedDictionary .ValueCollection', вы обнаружите, что это просто' System.Collections.Generic'. –

+0

Отличный ответ. Благодарю. Это очень ясно. – CSharpened

1

Отражение не зависит от конкретного языка.

Точечная обозначение (Namespace.Namespace.OuterClassName.InnerClassName) относится к категории C#. Отражение должно работать для каждого языка, который вы можете использовать для компиляции в IL. Кроме того, как вы можете быть уверены, при отражении, что OuterClassName - это не просто еще одна часть пространства имен без изучения других свойств класса Type?

Вы спрашиваете, почему это не так просто, как обозначение точки? Вы также можете спросить: «Почему это не просто возвращается как нотация IronPython», либо нотация IronLisp, либо нотация L #, либо обозначение BOo, или ...

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

Смежные вопросы