문제

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#이 참조와 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);
}

두 가지 접근 방식 모두 한 번만 부동산을 호출합니다. 두 번째는 더 명확합니다.

다른 생각들; 메소드 이름을 지정하십시오! 즉 obj.SomeMethod() - 이것은 그것이 작동한다는 기대를 설정하고 바람직하지 않은 것을 피합니다. obj.Foo != obj.Foo (배열의 경우).

마지막으로 Eric Lippert는 좋은 것을 가지고 있습니다 이 주제에 관한 기사.

다른 팁

일부 답변에 언급 된 readonlycollection을 사용하지 않은 사람들의 힌트처럼.

[C#]

class XY
{
  private X[] array;

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

이것이 도움이되기를 바랍니다.

비용이 많이 드는 속성이있을 때마다 (통화시 컬렉션을 재현하는 것과 같은) 속성을 문서화하고 각 통화가 비용이 발생하거나 개인 필드로 값을 캐시합니다. 비용이 많이 드는 속성 getters는 방법으로 작성해야합니다. 일반적으로, 나는 컬렉션을 배열 대신 ienumerable로 노출 시키려고 노력하여 소비자가 Foreach (또는 열거 자)를 사용하도록 강요합니다.

배열 사본을 만들지 않으면 배열의 사본을 만들지 않습니다. 그러나 객체가 개인적으로 소유 한 배열에 대한 참조를 전달하면 불쾌한 부작용이 있습니다. 참조를받는 사람은 기본적으로 소유자가 제어 할 수없는 방식으로 내용을 변경하는 것을 포함하여 배열로 자신이 좋아하는 모든 것을 자유롭게 할 수 있습니다.

배열로 무단으로 간주되는 것을 방지하는 한 가지 방법은 내용 사본을 반환하는 것입니다. 또 다른 (약간 더 나은)는 읽기 전용 컬렉션을 반환하는 것입니다.

그럼에도 불구하고,이 일을하기 전에 너무 많은 정보를 제공 할 것인지 스스로에게 물어봐야합니다. 어떤 경우에는 (실제로, 종종) 배열을 비공개로 유지하고 대신 소유하는 객체에서 작동하는 방법을 제공하는 것이 더 좋습니다.

MyOBJ는 명시 적으로 아이템을 작성하지 않으면 새 항목을 만들지 않습니다. 따라서 더 나은 메모리 사용량을 만들려면 개인 컬렉션 (목록 또는 기타)을 사용하고 개인 컬렉션에서 지정된 값을 반환하는 인덱서를 사용하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top