为什么我不能在实例化后改变用作属性的结构中的字段?

Ela*_*lan 2 c# struct

我在C#中定义了如下结构(为了演示目的而简化),我在对本机DLL的互操作调用中使用它:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyStruct
{
    private byte val0;
    private byte val1;
    private byte val2;
    private byte val3;

    public MyStruct(UInt32 id)
    {
        this.val0 = (byte)id;
        id >>= 8;
        this.val1 = (byte)id;
        id >>= 8;
        this.val2 = (byte)id;
        id >>= 8;
        this.val3 = (byte)id;
    }

    public void Clear()
    {
        this.val0 = this.val1 = this.val2 = this.val3 = 0;
    }

    public override string ToString()
    {
        return
            this.val3.ToString("X2") + this.val2.ToString("X2") + "-" +
            this.val1.ToString("X2") + this.val0.ToString("X2");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新: 此结构是另一个类中的属性.如下:

public class MyClass
{
    MyStruct MyStruct { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我使用值实例化结构并通过调用Clear()来跟随它时,内容不会被清除.当我使用调试器进入Clear()方法时,我看到每个字段都被清除.然而,一旦对Clear()的调用完成,原始结构实例将保持原始实例化值不变.

MyClass class1 = new MyClass();
class1.MyStruct = new MyStruct(0x12345678);
System.Diagnostics.Debug.WriteLine("Init: " + class1.MyStruct.ToString());
class1.MyStruct.Clear();
System.Diagnostics.Debug.WriteLine("Clear: " + class1.MyStruct.ToString());
Run Code Online (Sandbox Code Playgroud)

以上结果如下:

Init:1234-5678
Clear:1234-5678

为什么是这样?可以在实例化之后清除结构吗?

编辑: 示例代码和结果可以在这里看到:http://ideone.com/6szn9

编辑:修改问题以更准确地反映与属性访问者相关的问题.

Ben*_*igt 5

对我不这样做. http://ideone.com/PDLnt

您的真实代码是否有机会使用财产?属性getter在返回时会生成一个副本.

  • 我同意本,我怀疑实际发生的是你的结构实例的副本在某些时候正在制作.这是C#中结构的常见缺陷 (2认同)