2016-07-06 1 views
1

나는이 두 개의 문자열을 저장하고 그 문자열 중 하나를 반환하는 toString() 메서드를 오버라이드 (override) 객체C#으로 확인 목록 상자에 사용자 정의 개체를 추가

  fooBar temp; 
      foreach (string foo in bar) 
      { 
       temp = new fooBar(); <--- Why is this line needed when I 
       am overwriting the code and path on each cycle before adding? 

       temp.code += "."; 
       temp.path += "."; 

       Console.WriteLine(temp); 
       clbFooBar.Items.Add(temp); 
      } 

콘솔에 인쇄를 덮어 코드를 순종하고 경로 문자열 값을 반환하지만 체크 된 목록 상자 항목은 모두 정확히 똑같은 항목 (마지막 항목의 ToString())입니다. 어떤 기본적인 프로세스가 진행 중인지 즉시 알 수 없습니까?

내가 clbFooBar.Items.Add(temp.ToString());로 변경이 절대적으로 잘 작동하지만 그 temp.ToString.ToString().Add 때문에 호출 처음에 .ToString()으로 동일하지 않을 경우? 나는 두 콘솔 인쇄를 생각하고 모두

편집 ToString() 전화로 .Add 같은 보는 역할을합니다 : temp = new fooBar(); 내 문제에 대한 수정 프로그램입니다, 난 그냥 직관 덮어 쓰기를 생각하는 날 리드 할 때이 수정이 왜 알고 싶어 두 문자열, 코드 및 경로가 충분해야하며이 다시 초기화가 없으면 체크 된 목록 상자의 모든 항목이 동일해야합니다.

+0

'temp = new fooBar();'줄을 지우면 같은 것을 의미합니까? –

+0

아니요, 콘솔 출력과 체크 된 목록 상자는 그 줄이 존재하는 경우에만 서로를 반영하므로 이해가되지 않습니다. – Bradley

+0

당신의 체크리스트에있는 아이템들은이 라인이 존재하지 않는다면 똑같이 보이지만 그 라인이 존재한다면 (정확히) 다른 것입니까? –

답변

3

그래서 질문은 당신이 당신의 루프 라인

temp = new fooBar(); 

를 유지하는 경우 코드가 제대로 작동 왜 것 같다,하지만이 줄을 ommit 경우 모두 동일한 항목과의 CheckedListBox을 채우기 않는 것 . 다음

fooBar temp; = new fooBar(); 
foreach (string foo in bar) 
{ 
    temp.code += "."; 
    temp.path += "."; 
    clbFooBar.Items.Add(temp); 
} 

당신이 여러 번 같은 인스턴스를 추가하고 속성 의 변경 :

이유는 당신이 그와 같은 루프 외부 fooBar하나 개 인스턴스를 생성하는 경우이다 각 반복에서 그 인스턴스. 당신이 새처럼 루프 내부 인스턴스 만드는 경우

:

foreach (string foo in bar) 
{ 
    fooBar temp; = new fooBar(); 
    temp.code += "."; 
    temp.path += "."; 
    clbFooBar.Items.Add(temp); 
} 

을 당신은 모든 반복에 대한 새로운 인스턴스를 가지고 있고 이미 추가 인스턴스를 변경하지 마십시오.


업데이트 : 당신이 codetemp 가지고 플러스 "." 어떤 기본 값으로 모두 설정으로 그들은 여전히 ​​모두가 같은 모양 것으로 나타났습니다.그래서 당신이 실제로하려고하는 것이 아직도 약간 명확하지 않습니다. 다음과 같은 내용 일 가능성이 있습니다 :

string s = string.Empty; 
foreach (string foo in bar) 
{ 
    s += "."; 
    fooBar temp; = new fooBar(); 
    temp.code = s; 
    temp.path = s; 
    clbFooBar.Items.Add(temp); 
} 
+0

아! 즉, 현재 체크리스트 박스에있는 인스턴스는 관계없이 인스턴스를 반영하기 때문에 모든 항목을 추가 한 후에 인스턴스가 현재 무엇인지 보여주는 것처럼 마지막 항목으로 표시됩니다. 체크리스트 상자 항목은 전달하는 인스턴스에 대한 참조가 아니라 전달하는 항목의 복사본이라는 가정을했습니다. 감사! – Bradley

+1

@ 브래들리 : 하나의 인스턴스 만 만들면 그 인스턴스가 하나만 존재한다는 것입니다. 예,이 동일한 인스턴스를 체크리스트에 여러 번 삽입하고 각 반복에서 속성을 변경했습니다. 마지막 변경 사항은 checklistbox에 표시된 내용입니다. –

+0

고마워,이 하나의 마음 boggled! 아직 금요일이야? – Bradley

0

foreach 루프 외부에 temp을 생성 한 다음 안에 초기화합니다.

루프의 각 단계마다 다시 초기화하지 않으면 결국 CheckedListBox이되며 그 안에있는 모든 항목은 동일한 개체를 가리 킵니다.

그래서 목록에서 볼 때 마지막 객체의 값을 얻게됩니다 (실제로는 오직 있기 때문에).

실제로 원하는 것은 바의 각 항목 (foo)을 CheckedListBox에 추가하는 것입니다. 그렇다면 이것을 사용하십시오.

 foreach (string foo in bar) 
     { 
      foo.code += "."; 
      foo.path += "."; 

      Console.WriteLine(foo); 
      clbFooBar.Items.Add(foo); 
     } 
+0

나는 자신을 아주 잘 설명하고 있다고 생각하지 않습니다. 완전한 반대가 일어나고 있습니다. 각 패스에서 다시 초기화하지 않으면 체크 된 전체 목록 상자에 마지막 항목의 중복으로 보이는 항목이 포함됩니다. – Bradley

+0

네, 이해합니다. 문제는 제가 설명한대로입니다. 내 접근 방식을 시도 해 봤니? –

+0

귀하의 접근 방식은 제 접근 방식이었으며 처음부터 문제를 제기했습니다. 다시 초기화하면 문제가 해결되고, 그 이유를 알고 싶습니다! 하하 – Bradley

관련 문제