C# 变量用作参数时更改值

C# 变量用作参数时更改值,c#,C#,我的方法接受一个SearchCriteria参数,然后将这个参数传递给2个方法。在GetFoo1中,criteria对象在传递给另一个查询数据库的方法之前会被修改 我的期望是,在这个方法的范围内,criteria对象应该保持不变。也就是说,将完全相同的对象传递给GetFoo1和GetFoo2,因为我不是通过引用传递条件 公共虚拟异步任务GetSnapshot(搜索条件) { var snapshot=新的SnapshotObject(); snapshot.Foo1=等待GetFoo1(标准);

我的方法接受一个SearchCriteria参数,然后将这个参数传递给2个方法。在GetFoo1中,criteria对象在传递给另一个查询数据库的方法之前会被修改

我的期望是,在这个方法的范围内,criteria对象应该保持不变。也就是说,将完全相同的对象传递给GetFoo1和GetFoo2,因为我不是通过引用传递条件

公共虚拟异步任务GetSnapshot(搜索条件) { var snapshot=新的SnapshotObject(); snapshot.Foo1=等待GetFoo1(标准); snapshot.Foo2=等待GetFoo2(标准); 返回快照; }
在本例中,当我调用GetFoo1时,我希望通过值传递条件。出于某种原因,当我将criteria对象传递到GetFoo1中时,修改会在我将其传递到GetFoo2时持久化,就像我通过引用传递一样

之所以发生这种情况,是因为
SearchCriteria
是一个类。因此,即使它是通过值传递的,传递的值也是对该对象的引用

这意味着调用方和访问同一对象的其他人将看到对对象本身的任何更改:

var list = new List<string>();
MyMethod(list);
if(list.Count == 0)   // this one will be false because list now have 1 item
    ....

void MyMethod(List<string> list)
{
    list.Add("hey!");
}
var list=newlist();
我的方法(清单);
if(list.Count==0)//此项将为false,因为列表现在有1项
....
void MyMethod(列表)
{
添加(“嘿!”);
}
但是,它们无法替换整个对象:

var list = new List<string>();
MyMethod(list);
if(list.Count == 0)   // this one will be true
    ....

void MyMethod(List<string> list)
{
    list = new List<string>() { "hey!" }; // does not affect the caller.
}
var list=newlist();
我的方法(清单);
if(list.Count==0)//此值为真
....
void MyMethod(列表)
{
list=new list(){“hey!”};//不影响调用方。
}
如果您通过引用传递该参数,第二个示例将更改调用者,使其指向新创建的
列表
,而不是其中的1项

您在“按值传递引用类型”部分链接的文章中对此进行了解释:

下面的示例演示如何通过值将引用类型参数
arr
传递给方法
Change
由于参数是对
arr
的引用,因此可以更改数组元素的值。
但是,尝试将参数重新分配到其他内存位置只在方法内部起作用,不会影响原始变量
arr


这是因为
SearchCriteria
是一个类。因此,即使它是通过值传递的,传递的值也是对该对象的引用

这意味着调用方和访问同一对象的其他人将看到对对象本身的任何更改:

var list = new List<string>();
MyMethod(list);
if(list.Count == 0)   // this one will be false because list now have 1 item
    ....

void MyMethod(List<string> list)
{
    list.Add("hey!");
}
var list=newlist();
我的方法(清单);
if(list.Count==0)//此项将为false,因为列表现在有1项
....
void MyMethod(列表)
{
添加(“嘿!”);
}
但是,它们无法替换整个对象:

var list = new List<string>();
MyMethod(list);
if(list.Count == 0)   // this one will be true
    ....

void MyMethod(List<string> list)
{
    list = new List<string>() { "hey!" }; // does not affect the caller.
}
var list=newlist();
我的方法(清单);
if(list.Count==0)//此值为真
....
void MyMethod(列表)
{
list=new list(){“hey!”};//不影响调用方。
}
如果您通过引用传递该参数,第二个示例将更改调用者,使其指向新创建的
列表
,而不是其中的1项

您在“按值传递引用类型”部分链接的文章中对此进行了解释:

下面的示例演示如何通过值将引用类型参数
arr
传递给方法
Change
由于参数是对
arr
的引用,因此可以更改数组元素的值。
但是,尝试将参数重新分配到其他内存位置只在方法内部起作用,不会影响原始变量
arr


也许你想“克隆”这个类的实例。Jon Skeet有一篇关于这个的很好的文章。看,也许你想“克隆”这个类的实例。看见