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