【发布时间】:2020-03-05 12:39:31
【问题描述】:
我有一个非常初学者的问题:我确定我在这里遗漏了一些非常基本的东西
我有这个代码的简化版本(使用数组等。仅用于说明目的):
DataObject dataObj = new DataObject(new byte[7]{1,1,1,1,1,1,1));
dataObj.Meta.Prop0 = 8;
dataObj.Property1 = new byte[5]{8,8,8,8,8};
CollectionAssert.AreEqual(new byte[7]{8,1,8,8,8,8,8}, dataObj.GetData()); //<--- Fails. array[0] is still 1.
Assert.AreEqual(8, dataObj.Meta.Prop0); //<--- Fails. Prop0 never updated (still 1)
Assert.AreEqual(new byte[5]{8,8,8,8,8}, dataObj.Property1); //<--- OK.
为什么dataObj.Meta.Prop0 没有返回正确的值?我正在更新DataObject.Meta setter 中的_data,但是,如果我在Metadata.GetData() 方法中放置一个断点(从DataObject.Meta setter 内部调用),它永远不会被触发..
以下是DataObject 类实现的详细信息(根据要求更新了GetSubrray() 和UpdateData() 的实现):
public class DataObject
{
private byte[] _data;
public DataObject(byte[] objectData)
{
_data = objectData;
}
public byte[] GetData()
{
return _data;
}
public Metadata Meta
{
get
{
return new Metadata(GetSubarray(0, 2));
}
set
{
UpdateData(0, value.GetData());
}
}
public byte[] Property1
{
get
{
return GetSubarray(2, 5);
}
set
{
UpdateData(2, value);
}
}
private void UpdateData(int start, byte[] data)
{
Array.ConstrainedCopy(data, 0, _data, start, data.Length);
}
private byte[] GetSubarray(int start, int length)
{
byte[] arr = new byte[length];
Array.ConstrainedCopy(_data, start, arr, 0, length);
return arr;
}
}
public class Metadata
{
private byte[] _metadata;
public Metadata(byte[] metadata)
{
_metadata = metadata;
}
public byte[] GetData()
{
return _metadata;
}
public byte Prop0
{
get
{
return _metadata[0];
}
set
{
_metadata[0] = value;
}
}
public byte Prop1
{
get
{
return _metadata[1];
}
set
{
_metadata[1] = value;
}
}
}
【问题讨论】:
-
Subarray方法从何而来?这不是我熟悉的标准方法。我的猜测是它正在复制数组的一部分 - 因此更改 copy 不会更改原始数据。 -
与
Update方法相同。请给我们看。 -
@Sach 它们不存在。我编造它们是为了表明我正在更新数组(并且我知道该功能有效)。
Subarray(m,n)做类似byte[] arr = new byte[n]; Array.ConstrainedCopy(_data, m, arr, 0, n); return arr;的事情,而Update(m,n)做相反的事情。 -
您能否在 .NetFiddle 中获得一个工作示例,谢谢。
-
@Sach:如果我在
Metadata.GetData()方法中的return _metadata;行上设置断点,则根本不会触发。
标签: c# class oop object properties