我在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
编辑:修改问题以更准确地反映与属性访问者相关的问题.
对我不这样做. http://ideone.com/PDLnt
您的真实代码是否有机会使用财产?属性getter在返回时会生成一个副本.