Что означает "+" в отраженном FullName и "*" после члена С#
В настоящее время я занимаюсь размышлением в С#. После:
Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetTypes()
И я нашел это: [System.Numerics.Matrix4x4], [System.Numerics.Matrix4x4+CanonicalBasis], [System.Numerics.Matrix4x4+VectorBasis]
(Есть отраженные типы из "System.Numerics.Vectors.dll") Я знаю что Matrix4x4 является структурой, однако я не могу найти информацию о CanonicalBasis и VectorBasis, и что означает "+" в этом контексте. Я занимался дальнейшими исследованиями, и еще одна странная вещь:
Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").FullName
"System.Numerics.Matrix4x4+VectorBasis"
Но:
Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").Name
"VectorBasis"
Более того, когда я просматривал элементы Matrix4x4 + VectorBasis, есть такой элемент:
[System.Numerics.Vector3* Element0]
И это необработанный указатель, как в c++? Или что это?
PS Я делал это в С# interactive, но я не думаю, что это повлияло на результаты.
Ответы
Ответ 1
Названия +
между классами означают, что часть после +
является вложенным типом типа, имя которого находится до +
. Например, Dictionary<string, string>+KeyCollection
. KeyCollection
- это внутренний класс Dictionary<TKey, TValue>
.
*
Обозначает указатель, так как указанное поле находится в небезопасном режиме:
public unsafe Vector3* Element0;
Ответ 2
В строке System.Numerics.Matrix4x4+VectorBasis
+
означает, что VectorBasis
является вложенным типом Matrix4x4
. В этом конкретном случае VectorBasis
является вложенной struct
внутри class
. Обратите внимание, что +
- это тот же символ, который не имеет значения, с какими типами вложенных типов вы имеете дело:
class A
{
public class B {}
}
struct A
{
public struct B {}
}
class A
{
public enum B {}
}
Все вложенные типы в этих примерах имеют одно и то же FullName
, A+B
В вашем случае VectorBasis
и CanonicalBasis
являются private
членами, поэтому вы не можете видеть их через Type.GetNestedTypes()
который показывает только public
члены.
*
После System.Numerics.Vector3*
означает, что это тип указателя. Строка происходит от Type
экземпляра FieldInfo.FieldType
собственности.
Вы можете просмотреть это и другие возможные строковые представления класса Type
на соответствующей странице документации MSDN.