0

2 つの viewState プロパティがあります。

1 つは、List<MyObject> MyObjects
もう 1 つはMyObject SelectedObject

ユーザーがリストからオブジェクトを選択するたびに、次のように SelectedObject に割り当てます。

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

これにより、 を簡単に操作できます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"
        }
        }
4

2 に答える 2

2

SelectedObjectオブジェクト参照です。リスト内の元のオブジェクトと同一でSelectedObjectあり、「元の」オブジェクトは同じオブジェクトです。そうでないことを示す動作が見られる場合は、質問を更新してください。

于 2012-11-20T22:54:32.570 に答える
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の出力は「Garbage」になり、refパラメーターにより、呼び出し元の参照も変更されました。

+編集MyObjectが構造体の場合、構造体は渡されたときにコピーされ、別のスコープ内で再割り当てしても元の構造体には影響しません。

このためにできることは、関数に構造を返し、それを割り当てることです。

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

または、参照パラメータで実行します。

于 2012-11-20T23:08:07.167 に答える