2010-12-01 2 views
0

개체를 만들고 일련의 양식을 통해 사용자 정의 컨트롤로 전달하는 데 다음 코드가 있습니다.이 예제에서 참조 유형에 대해 무엇을 놓치고 있습니까?

public class MyObject 
{ 
    public List<AnObject> Objects {get; set;} 
} 

양식 1 :

private void MyObject _myObject = new MyObject{Objects = new List<AnObject>()}; 

... 

Form2 form2 = new Form2(ref _myObject); 
form2.Show(); 

양식 2 : 나는 위해 UserControl1의 개체에 새로운 myObject에()를 추가하면

public Form2(ref MyObject myObject) 
{ 
    UserControl1 myControl = new UserControl1(); 
    myControl.Objects = myObjects.Objects 
} 

위해 UserControl1는

public List<AnObject> Objects {get; set;} 
... 

Objects.Add(new myObject()); 

, 그것은 아무튼 Form1에서 내 원래 목록을 업데이트하지 마십시오. myObject를 참조로 전달하고 있습니다. 내가 생각할 수있는 유일한 방법은 내 값을 어떻게 든 언 박싱하는 것입니다. Form2에 AnObject 목록을 UserControl1에 할당하는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

무슨 일이 일어나고 있는지 알려주는 코드가 충분하지 않습니다. 짧지 만 완벽한 프로그램을 제공하십시오. 이상적인 콘솔 앱입니다. 여기서 사용자 인터페이스를 사용할 필요가 없습니다. 헨크 (Henk)가 말했듯이, 여기에도 '심판'이 필요하지 않습니다. –

+1

myObjects를 컨트롤 (예 : ListBox)의 DataSource로 사용하고 myObjects에 추가 할 때 해당 컨트롤이 업데이트되지 않습니까? – m0sa

답변

4
  1. 심판이 예제와는 아무 상관이 없습니다. ref이 없으면 의도 한대로 목록 참조가 전달됩니다 (두 양식 모두에서 공유됩니다). (심판 키워드가 필요한 코드 - 정말 희귀 한 코드입니다.)

  2. List<T>은 변경에 대한 알림이 없습니다. 따라서 한 가지 형식으로 내용을 변경하면 다른 내용은 내용을 알 수 없습니다. ObservableCollection<T>을 사용하고 컨트롤에서 CollectionChanged 이벤트를 구독하십시오.

2

ref도 필요하지 않습니다. 내가 UserControl1을 개체에 새로운 myObject에()를 추가하면

, 그것은 그 일을해야 Form1에

에 내 원래의 목록을 업데이트하지 않습니다. 더 정확한 코드를 게시,이 부분이 저를 보여줍니다 코드 붙여 넣기/복사되지 않은 :

public Form2(ref MyObject myObject) 
{ 
    UserControl1 myControl = new UserControl1(); 
    myControl.Objects = myObjects.Objects // extra 's' 
} 

그래서 우리가 지금 실제 물건의 부정확 한 복사본입니다 코드에서 작은 문제를 찾고 있습니다. 희망이 없다.

1

.NET의 개체는 어쨌든 참조 유형입니다. 이 경우 ref은 새 객체를 반환하는 대신 동일한 매개 변수에서 다른 객체를 다시 전달하려는 경우에만 필요합니다. 여기에서하는 일에 대해서는 ref은 완전히 불필요합니다. (값 유형 인 struct과 대조적으로 ref은 잠재적으로 유용한 작업을 수행합니다.) 마찬가지로 객체는 이미 값 유형이기 때문에 여기서 복싱 또는 언 박싱의 개념이 없습니다.

관련 문제