C# 如何从结构中的固定缓冲区访问元素?

C# 如何从结构中的固定缓冲区访问元素?,c#,struct,fixed,unsafe,C#,Struct,Fixed,Unsafe,我正在尝试这样做,但是似乎没有任何东西被分配给BoneIDs或bonewights,在C中这样做的正确方式是什么 使用封送技术 const int MaxBoneCount = 10; public struct VertexBoneData { public Vector3 Position; public Vector3 Normal; public Vector2 Tex

我正在尝试这样做,但是似乎没有任何东西被分配给
BoneIDs
bonewights
,在C中这样做的正确方式是什么

使用封送技术

        const int MaxBoneCount = 10;
        public struct VertexBoneData
        {
            public Vector3 Position;
            public Vector3 Normal;
            public Vector2 TexCoord;
            [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
            public float BoneIDs[];
            [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
            public float BoneWeights[];
        }

从广义上讲,您所拥有的很好(我个人会将固定缓冲区字段设置为私有,并在
I
上添加一些范围检查)。我强烈怀疑,您在这里实际要解决的是传递值语义,在这种语义中,您正在对值的一个独立副本进行操作。下面是一个完全可运行的演示,您的类型为“原样”(无更改),显示一切正常:


使用制度;
静态类程序
{
静态void Main()
{
VertexBoneData=新的VertexBoneData();
数据。SetBoneID(342f);
Console.WriteLine(data.GetBoneID(3));//写入42
//我怀疑你在做什么
SomePassByValueMethod(数据);
Console.WriteLine(data.GetBoneID(3));//仍然写入42,而不是16
//有一种方法可以解决这个问题
SomePassByReferenceMethod(参考数据);
Console.WriteLine(data.GetBoneID(3));//写入122
}
静态void SomePassByValueMethod(VertexBoneData数据)
{
数据。SetBoneID(3,16F);
}
静态void SomePassByReferenceMethod(ref VertexBoneData数据)
{
数据。SetBoneID(3122f);
}
}
公共不安全结构VertexBoneData
{
公共向量3位置;
公共向量3正常;
公共矢量2 TexCoord;
公共固定浮动BoneIDs[Bone.maxbonecoount];
公共固定浮动BoneWeights[Bone.MaxBoneCount];
公共浮点GetBoneID(int i)
{
返回BoneIDs[i];
}
公共void SetBoneID(int i,浮点值)
{
BoneIDs[i]=值;
}
公共浮点数GetBoneWight(int i)
{
返回骨骼重量[i];
}
公共void SetBoneWeight(整数i,浮点值)
{
BoneWeights[i]=值;
}
}
静态类骨
{
public const int MaxBoneCount=4;//随便什么
}
//只是在这里避免依赖,因为我在控制台中
公共只读结构向量3{}
公共只读结构向量2{}

这是什么版本的C#?当使用.net core 3.0.100编译时,代码按预期工作。我通过
.SetBoneID(2,45.76f)设置BoneIDs的元素2
boneData.GetBoneID(2)
returned
45.76
这是实现这一点的正确方法,无需固定即可访问固定字段,可从C#7.3开始使用。(文档中的右键)请出示一个演示问题的最小复制品?在最新的编译器上,这应该没问题,所以repro(即我们可以运行的一个Main()方法,它可以准确地显示您看到的内容)会有所帮助。我的猜测是,您实际上在代码(您没有向我们展示的代码)中看到了一个按值复制的语义错误,也就是说,当您实际更新结构的独立副本时,您希望在某个位置显示一个副作用。这是一件非常不同的事情,并且没有解决专门关于访问固定缓冲区的问题。编组可能对p/invoke有用,但它与所询问的问题无关。
        const int MaxBoneCount = 10;
        public struct VertexBoneData
        {
            public Vector3 Position;
            public Vector3 Normal;
            public Vector2 TexCoord;
            [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
            public float BoneIDs[];
            [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)]
            public float BoneWeights[];
        }