簡體   English   中英

避免陣列重復

[英]Avoiding array duplication

根據[MSDN:陣列使用指南]( http://msdn.microsoft.com/en-us/library/k2604h5s ( VS.71).aspx)

數組值屬性

您應該使用集合來避免代碼效率低下。 在下面的代碼示例中,每次調用myObj屬性都會創建一個數組副本。 結果,將在以下循環中創建2n + 1個陣列副本。

[Visual Basic]

Dim i As Integer
For i = 0 To obj.myObj.Count - 1
   DoSomething(obj.myObj(i))
Next i

[C#]
for (int i = 0; i < obj.myObj.Count; i++)
      DoSomething(obj.myObj[i]);

除了從myObj []到ICollection myObj的更改之外,您還會推薦什么? 剛剛意識到我當前的應用程序正在泄漏內存:(

謝謝;

編輯:強制C#傳遞參考w / ref(安全放棄)提高性能和/或內存使用?

不,它不是泄漏內存 - 它只是讓垃圾收集器比它更難工作。 實際上,MSDN文章有點誤導:如果屬性在每次調用時都創建了一個新集合 ,那么它與數組一樣糟糕(內存方面)。 也許更糟糕的是,由於大多數集合實現通常過大。

如果您知道方法/屬性確實有效,則始終可以最小化調用次數:

var arr = obj.myObj; // var since I don't know the type!
for (int i = 0; i < arr.Length; i++) {
  DoSomething(arr[i]);
}

甚至更容易,使用foreach

foreach(var value in obj.myObj) {
  DoSomething(value);
}

這兩種方法只調用一次屬性。 第二個是更清晰的IMO。

其他想法; 把它命名為方法! obj.SomeMethod() - 這設置了它確實有效的期望,並避免了不受歡迎的obj.Foo != obj.Foo (這將是數組的情況)。

最后,Eric Lippert有一篇關於這個主題的好文章

正如對那些沒有使用某些答案中提到的ReadOnlyCollection的人的暗示:

[C#]

class XY
{
  private X[] array;

  public ReadOnlyCollection<X> myObj
  {
    get
    {
      return Array.AsReadOnly(array);
    }
  }
}

希望這可能有所幫助。

每當我有昂貴的屬性(比如在電話中重新創建一個集合)時,我要么記錄該屬性,說明每次調用都會產生成本,或者我將該值緩存為私有字段。 昂貴的財產獲取者應該作為方法編寫。 通常,我嘗試將集合公開為IEnumerable而不是數組,從而迫使消費者使用foreach(或枚舉器)。

除非你這樣做,否則它不會復制數組。 但是,簡單地將引用傳遞給對象私有的數組會產生一些令人討厭的副作用。 接收引用的人基本上可以自由地對陣列做任何他喜歡的事情,包括以其所有者無法控制的方式改變內容。

防止未經授權干擾陣列的一種方法是返回內容的副本。 另一個(稍微好一點)是返回一個只讀集合。

不過,在做任何這些事情之前,你應該問問自己是否要泄露太多信息。 在某些情況下(實際上,經常),最好保持數組私有,而是提供對擁有它的對象進行操作的方法。

除非您明確創建新項目,否則myobj不會創建新項目。 所以為了更好的內存使用我建議使用私有集合(列表或任何)並公開索引器,它將從私有集合返回指定的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM