C#反射中FullName的"+"、成员后"*"含义及内部类型疑问
解答你的C#反射相关疑问
Hey there, let's unpack your questions about C# reflection and those nested types in System.Numerics.Vectors.dll!
1. 类型FullName中"+"的含义
那个+符号是.NET反射用来表示嵌套类型的标准标记。当你看到Matrix4x4+CanonicalBasis,就意味着CanonicalBasis是定义在Matrix4x4结构体内部的嵌套类型。在C#代码里,它的写法大概是这样的:
public struct Matrix4x4 { // 嵌套静态类 public static class CanonicalBasis { // 内部成员:预定义矩阵常量等 } }
反射系统用+来分隔外部类型和它的嵌套类型,这是区分嵌套类型和普通顶级类型的关键标识。
2. CanonicalBasis和VectorBasis是什么
这两个都是Matrix4x4内部的静态嵌套辅助类,设计用来提供预定义的常用矩阵常量,帮你省去手动重复创建这些通用矩阵的麻烦。具体来说:
CanonicalBasis包含了标准3D坐标系下的基矩阵,比如Front(前向视图的基准矩阵)、Left(左向基准矩阵)、Up(上向基准矩阵)等静态属性,直接返回对应的预初始化Matrix4x4实例;VectorBasis则提供了和向量基相关的工具成员,比如通过传入三个正交向量生成对应基矩阵的静态方法或属性。
因为它们是嵌套在Matrix4x4内部的辅助类型,官方文档通常不会单独为它们做详细说明,你可以通过反射进一步探索它们的成员,比如运行这段代码查看具体内容:
var dllPath = @"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll"; var canonicalBasisType = Assembly.LoadFile(dllPath) .GetType("System.Numerics.Matrix4x4+CanonicalBasis"); Console.WriteLine("CanonicalBasis members:"); foreach (var member in canonicalBasisType.GetMembers(BindingFlags.Public | BindingFlags.Static)) { Console.WriteLine($" - {member.Name} ({member.MemberType})"); }
3. 成员后"*"的含义
你提到的成员末尾的*,一般是反射用来标识指针类型的标记。比如如果某个成员的类型是int*(整数指针),反射返回的类型名称就会显示为System.Int32*。这种类型属于C#的不安全代码范畴,通常用于需要直接操作内存地址的场景,比如高性能计算或与非托管代码交互时。
需要注意的是,只有当成员是指针类型时才会出现这个标记,普通值类型或引用类型不会有这个后缀。
内容的提问来源于stack exchange,提问作者Kacper
相关产品推荐
相关产品推荐

