2010-04-14 62 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

相關問題