Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过引用指定对象_C#_Asp.net - Fatal编程技术网

C# 通过引用指定对象

C# 通过引用指定对象,c#,asp.net,C#,Asp.net,我有两个viewState属性 一个是列出我的对象 另一个是MyObject SelectedObject 每当用户从列表中选择一个对象时,我都会将其指定给SelectedObject,如下所示: SelectedObject = MyObjects.Where(x=>x.MyId ==IdSelectedInUI) 这使我可以轻松地操纵所选对象。 现在,当我更改SelectedObject的属性时,如何将这些属性分配回列表中的原始对象?我想用ref,但不能完全理解 编辑 所有对象都

我有两个viewState属性

一个是列出我的对象 另一个是MyObject SelectedObject

每当用户从列表中选择一个对象时,我都会将其指定给SelectedObject,如下所示:

SelectedObject = MyObjects.Where(x=>x.MyId ==IdSelectedInUI)  
这使我可以轻松地操纵所选对象。 现在,当我更改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"
        }
        }

SelectedObject是一个对象引用。它与列表中的原始对象相同-SelectedObject和原始对象是同一个对象。如果您看到的行为表明情况并非如此,请更新您的问题。

视情况而定。假设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的打印输出将是垃圾,因为引用本身已更改,并且由于ref参数,这也更改了调用方中的引用

+编辑 但是,如果MyObject是一个结构,则传递时会复制该结构,并且在不同的范围内重新分配它不会对原始结构产生影响

为此,您可以让函数返回结构并分配它:

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

或者通过引用参数进行操作。

我认为这里的问题是,对象被分配到ViewState,然后当它返回时,ViewState将用一个新实例还原。OP还提到了ViewState。MyObjor可能是一个计算属性,它从VS序列化到反序列化,假设用户来自C++背景。当我转换到c时,我对值和引用非常困惑。SelectedObject不是MyObject类型,而是IEnumerable类型。如何更改其属性?@TimSchmelter,请查看我的编辑。