2009-08-19 1 views
2

저는 List<T>을 가지고 있는데, 나는 대략적으로 설명하려고하는 행동을 피할 필요가 있습니다 :.NET Generic List <T> 문제는 설계 상 작동하며 해결해야합니다. 참조 대신 값 추가

 // assume cls and numberToAdd are parameters passed in. 
    int pos = numberToAdd; 
    List<MyClass> objs = new List<MyClass>(numberToAdd); 

    for(int i = 0; i < numberToAdd; i++) 
    { 
     objs.Add(cls); 
     objs[i].X = -((pos * cls.Width) + cls.Width/2); 
     pos--; 
    } 

    Console.WriteLine(objs[0].X + "\r\n" + objs[1].X); 

이 결과는이 글에서 동일한 값을 출력합니다.

기본적으로 필요한 것은 "Add"메서드의 동작을 변경하는 것입니다. 나는 동일한 객체에 대한 단순한 참조가 아닌 동일한 값을 가진 객체의 새 인스턴스를 추가하고 싶습니다. 나는 이것이 더 많은 메모리를 사용할 것이라는 것을 이해한다.

답변

1

'cls'변수 란 무엇입니까? 각 루프 안에 새로운 루프를 생성하십시오. 당신이하고 싶은 것은 그것을 복제하는 것입니다; 그러나 정직하게 그것은 혼란 스러울 것이다. 루프 당 하나만 새로 작성하는 것이 좋습니다.

- 편집은 'CLS'에 대해 언급 것 드러내

.

나는 당신이 그것을 복제 할 것을 제안한다. (당신이 전화를 바꿀 수없고 위의 제안을 할 수 없다고 가정 할 때). 새 작업을 만들고 모든 속성을 복사하면됩니다.

일반적으로 'cls'유형을 제어 할 수 있다면 '복사'생성자 만 만들면됩니다. 그것은 이렇게 :

class Foo { 
    private int x; 

    public Foo (Foo toCopy) { 
     this.x = toCopy.x; 
    } 

    ... 
} 
+0

가 이렇게까지 종료, 대신 생성자의 방법으로 사용 - 하나 이상의 다른 장점이있다? – Nate

+0

아니요. 어느 쪽이라도 괜찮습니다. 생성자는 개체를 만들기 전에 개체를 완전히 복제했음을 보증합니다. 이 메서드는 '.Clone()'을 호출 할 때까지 미리 객체가 비어 있음을 의미 할 수 있습니다. –

1

클론 방법을 포함하도록 cls를 확장 할 수 있습니다. 확장 메서드는 cls 클래스를 수정할 수없는 경우 작동합니다.

다음으로 변경하십시오. objs.Add (cls); ~ objs.Add (cls.Clone());

1

아. cls를 구조체로 구현하여 값을 전달하는 의미를 나타내야합니다.

또는 cls 개체에 복제 메서드를 구현해야 개체 복제 메서드를 만들 수 있으므로 개체 참조를 새로 만들 수 있습니다.

개체 자체에 대한 액세스 권한이없는 경우에도이 작업을 수행 할 수있는 확장 방법을 만들 수 있습니다.

public cls Clone(this cls) 
{ 
    //initialise the object to clone it. 
    return new cls(this.param1, this.param2,...) 
} 
0

같은 개체처럼 보입니다. cls가 목록에 numberToAdd 시간을 추가하고 있습니다.

루프 내부에 개체의 새 인스턴스를 만들어야합니다.

for(int i = 0; i < numberToAdd; i++) 
{ 
    MyClass c=new MyClass(...); 
    c.X = -((pos * c.Width) + c.Width/2); 
    objs.Add(c); 
    pos--; 
} 
0

유무 MyClass에 ICloneable을 구현하고 단순히

objs.Add((MyClass)cls.Clone()); 
+1

ICloneable.Clone()은 객체를 반환하므로 객체를 목록에 추가하기 전에 캐스트가 필요하다고 생각합니다. – Badaro

+0

완료, 감사합니다 :) –

관련 문제