2013-02-14 1 views
13

Полное имя разделителя в C# является символом периода (.). например System.Console.Write.Является ли разделитель пространства имен C# (.) Определенным?

Определяется ли это где-то как Path.PathSeperator, или же он жестко закодирован в классах отражения .NET?

(например, в Type.FullName реализованы как Type.Namespace + "." + Type.Name при условии, что она не изменится

ответ

15

В основном: спецификации языка Но на самом деле, Type.FullName использует BCL определение, а не определение C# - и интересно они не согласны?.. Например:

namespace X { 
    public class Y { 
     public class Z {} 
    } 
} 

для C#, Z является X.Y.Z, к BCL это X.Y+Z представление воспроизведенных тоже меняется - с помощью BCL обратно-т. icks и числа, а не угловые скобки. I верят BCL использует формат CLI типов (который имеет отдельную спецификацию), но если вы думаете об этом: этого не требуется (за исключением во время отражения-излучения).

AFAIK, эти разделители не подвергаются ни с чем, как Path.PathSeparator, - но, как вы говорите, жестко закодированы в классах Type и т. Д.

+0

Я думаю, что обозначение 'X.Y + Z' можно увидеть для анонимных типов и в виде следов стека ...? –

+0

@ThorstenDittmar с точки зрения C#, анонимные типы * никогда не имеют имени *. Компилятор генерирует имена, которые являются незаконными в C# - такие вещи, как '<> _ 4' (и т. Д.). Вы увидите только такие обозначения для анонимных типов, если посмотреть на их имя BCL, возможно, через '.GetType()', но это ничем не отличается от обычного типа типа X.Y + Z. В терминах трассировки стека: да, он будет использовать внутреннее представление типов: потому что опять же, это не компилятор, работающий в этой точке, поэтому терминология C# не применяется. Аналогично, 'int' обычно будет' System.Int32' и т. Д. –

5

Разделитель между типом и его пространством имен определен в BCL на поле Type.Delimiter. Вы увидите это значение, используемое в API Reflection, и его можно надежно использовать для конкатенации типа и его пространства имен.

1

В соответствии с тем, где it's used в исходных источниках, @ Paul's Type.Delimiter является ответом на ваш основной вопрос, но ответ на ваш вопрос, например, да, '.', а также '+', как указано в ответе @ Marc, является hard coded.

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