我正在尝试理解接受字节数组的构造函数关于它如何存储数据的正确方法(特别是PhysicalAddress)
我有一个6个字节的数组(theAddress),它构造一次。
我有一个从TCP连接加载的18bytes(theAddresses)源数组。
然后我将地址+偏移量中的6字节复制到地址中,并从中构造物理地址。
问题是PhysicalAddress只是将引用存储到传入的数组中。因此,如果您随后检查地址,它们只会指向最后复制的地址。
当我使用反射器查看PhysicalAddress内部时,很容易看到发生了什么。
public PhysicalAddress(byte[] address)
{
this.changed = true;
this.address = address;
}
现在我知道这可以通过在每次传递中创建地址数组来解决,但我想找出真正的最佳实践。
答案 0 :(得分:1)
一般来说,没有其他特定设计考虑因素需要考虑的最佳实践肯定是(1)接受字节数组的对象的构造函数应创建自己的私有变量来保存数据并从中复制它原始
答案 1 :(得分:1)
听起来像你的构造函数应该是这样的:
public PhysicalAddress(byte[] source, int offset)
{
// Validate arguments here :)
this.changed = true;
this.address = new byte[6];
Buffer.BlockCopy(source, offset, address, 0, 6);
}
这样你就可以从原来的18字节数组中复制一次。
采取防御性副本听起来像是正确的方法 - 但你只需要做一次。在构造函数本身内执行此操作是有意义的,而不是强制PhysicalAddress
相信任何调用它的代码都不会在之后更改数组。