2010-04-14 54 views
1

我想了解什么,接受关于字节数组它是如何将其存储的数据(特别是与PhysicalAddress什么是正确的方法从字节数组构建PhysicalAddress对象

构造正确的处理方法

我有一个6字节的数组(地址),构造一次。

我有一个从TCP连接加载的18字节(theAddresses)源数组。

然后,我将6位从地址+偏移量复制到地址中,并从中构建PhysicalAddress。

问题是PhysicalAddress只是存储的引用中传递的阵列。因此,如果您随后检查它们永远只能指向在复制的最后一个地址的地址。

当我接过来一看在带有反射器的PhysicalAddress中,很容易看到发生了什么。

public PhysicalAddress(byte[] address) 
{ 
    this.changed = true; 
    this.address = address; 
} 

现在我知道这可以通过在每次通过创建theAddress阵列来解决,但我想找出真正是我们的最佳实践。

  1. 应该接受字节数组对象的构造函数创建它自己的私有变量用于保存数据,并从原来的
  2. 复制它应该只是保持参考一下被通过。
  3. 我应该只是在循环中的每个通道创建地址

回答

1

我会说一般最好的做法,没有其他具体的设计考虑因素考虑是(1)接受字节数组的对象的构造函数应该为holdin创建自己的私有变量g数据并从原始数据复制。

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相信无论调用哪个代码都不会在之后改变数组。

+0

这不是我的构造函数,它是.NETFramework 2.0的一部分,3.5是相同的。 (system.net.networkinformation) – 2010-04-14 06:19:06

+1

@Paul:哇,这很糟糕。好吧,我想我回答了你的“最佳实践”问题 - 但是当提出这样的课程时,你必须自己做防御性复制,基本上是:( – 2010-04-14 06:32:43

相关问题