2012-11-20 2 views
0

두 개의 viewState 속성이 있습니다.참조 객체에 의해 할당

SelectedObject = MyObjects.Where(x=>x.MyId ==IdSelectedInUI) 

이 나에게 쉽게 조작 할 수 있습니다 : 나는이 같은 SelectedObject에 할당

하나는 List<MyObject> MyObjects
이며, 다른 하나는 사용자가 목록에서 개체를 선택 할 때마다 MyObject SelectedObject

입니다 SelectedObject.
이제 SelectedObject의 속성을 변경할 때 어떻게 해당 속성을 목록의 원래 개체에 다시 할당 할 수 있습니까? 나는 ref을 사용하려고 생각했지만, 그것을 이해할 수는 없습니다.

편집 개체는 모두 구조체가 아니라 클래스입니다.
그래서, 여기에 내가 가진 무엇 :

//Children are of type =List<MyParentObject.ChildObject> 
public MyParentObject MyParent 
     { 
      get 
      { 
       if (ViewState["MyParent"] == null) 
       { 
        MyParent= GetItemsFromDatabase(); 
       } 
       return (TaskInfo)ViewState["MyParent"]; 
      } 

      set 
      { 
       ViewState["MyParent"] = value; 
      } 
     } 

     public MyParentObject.ChildObject SelectedChild 
     { 
      get 
      { 
       return (MyParentObject.ChildObject)ViewState["Child"]; 
      } 

      set 
      { 
       ViewState["Child"] = value; 
      } 
     } 
     protected onButtonClick() 
     { 
      SelectedChild = MyParent.Children.Where(x=>x.Child_Id == Convert.ToInt32(txt.Text)).FirstOrDefault(); 
     SelectedChild.Property2 = "test2" //OldValue "test1" 
     //now if I run 
     MyParent.Children.Where(x=>x.Child_Id ==Convert.ToInt32(txt.Text)).Select(x=>x.Property2) //Shows "test1" and I expect "test2" 
     } 
     } 
+1

'SelectedObject'는 'MyObject' 타입이 아니고 IEnumerable '타입입니다. 당신은 그것의 속성을 어떻게 변경합니까? –

+0

@TimSchmelter, 제 편집을 참조하십시오. – user194076

답변

2

SelectedObject는 객체 참조입니다. 목록의 원본 개체 (SelectedObject)와 동일하며 "원본"개체는 동일한 개체입니다. 달리 표시되는 동작이 나타나면 질문을 업데이트하십시오.

+1

물론 MyObject가 클래스라고 가정하면 ... –

+0

저기 있습니다. :) – prprcupofcoffee

+0

여기에 문제가 개체가 ViewState에 할당되고 나서 다시 돌아올 때 ViewState가 새 인스턴스로 복원된다는 것입니다. –

0

다릅니다. MyObject가 클래스라고 가정하면, "값에 의해"전달되지만 전달되는 값은 원래 개체에 대한 참조입니다. 예를 들어

는 :

void Mutate(SomeObject x) 
{ 
    x.val = "banana"; 
} 
void Reassign(SomeObject x) 
{ 
    x = new SomeObject(); 
    x.val = "Garbage"; 
} 
public static void Main() 
{ 
    SomeObject x = new SomeObject(); 
    x.val = "Apple"; 
    Console.WriteLine(x.val); // Prints Apple 
    Mutate(x); 
    Console.WriteLine(x.val); // Prints banana 
    Reassign(x); 
    Console.WriteLine(x.val); // Still prints banana 
} 

이 통과는 C#으로 작품을 객체 방법이다. 내용은 수정할 수 있지만 객체 자체의 "값"은 수정할 수 없습니다 (메모리에있는 포인터).

개체의 내용을 변경하려는 경우 특별한 조치를 취할 필요가 없습니다.

개체를 ref 매개 변수로 전달하면 개체에 대한 참조를 다시 할당 할 수 있습니다. 예를 들어, :

void Reassign(ref SomeObject x) // implementation 

는 앞의 예에서 사용 된 최종를 WriteLine 밖으로 인쇄 자체 인해 심판 매개 변수로 변경하고, 한 참고로, "쓰레기"이었을 것입니다,이 변경된 호출자의 참조도 마찬가지입니다.

+ 편집 그러나 MyObject가 구조체 인 경우 구조체가 전달되면 복사되고 다른 범위 안에 다시 할당해도 원래 구조에는 영향을 미치지 않습니다.

MyStruct Mutate(MyStruct x){} 
// calling 
myStruct = Mutate(myStruct); 

또는 참조 매개 변수에 의해 그것을 할 :

는 당신이를 위해 할 수있는 것은 함수 구조를 반환하고 할당하는 것입니다.

관련 문제