通过引用分配对象

时间:2012-11-20 22:51:06

标签: c# asp.net

我有两个viewState属性。

一个是List<MyObject> MyObjects
另一个是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"
        }
        }

2 个答案:

答案 0 :(得分:2)

SelectedObject是一个对象引用。它与列表中的原始对象相同 - SelectedObject,“原始”对象是同一个对象。如果您发现其他情况,请更新您的问题。

答案 1 :(得分: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);

或者通过参考参数来做。