C# 按值传递接口成员
预期控制台的两个输出行都会打印“一些示例数据”,但似乎新值正在覆盖C# 按值传递接口成员,c#,.net,visual-studio-2010,.net-4.0,C#,.net,Visual Studio 2010,.net 4.0,预期控制台的两个输出行都会打印“一些示例数据”,但似乎新值正在覆盖TestString?这不是像“在C中默认情况下,所有的值都是按值传递的吗?” 简而言之,如何在MethodSample1中保留“TestString”的值 (我遇到了这个问题,因为我所有的项目都基于一个接口) 即使保留了价值,它也确实反映了!奇怪 对于您当前的问题,我认为您无法阻止任何方法修改传递给它的参数 您的变量是一个引用类型对象,在C#中,引用类型的地址通过值传递给一个方法,这就是您看到更改的原因。例如,如果您的方法是这样
TestString
?这不是像“在C中默认情况下,所有的值都是按值传递的吗?”
简而言之,如何在MethodSample1
中保留“TestString”的值
(我遇到了这个问题,因为我所有的项目都基于一个接口)
即使保留了价值,它也确实反映了!奇怪 对于您当前的问题,我认为您无法阻止任何方法修改传递给它的参数 您的
变量
是一个引用类型对象,在C#中,引用类型的地址通过值传递给一个方法,这就是您看到更改的原因。例如,如果您的方法是这样编写的:
public void MethodSample1(Itest variable)
{
variable.TestString = "some sample data";
Itest var1 = variable;
Console.WriteLine(variable.TestString);
MethodSample2(variable);
Console.WriteLine(variable.TestString);
Console.WriteLine(var1.TestString);
}
public void MethodSample2(Itest variable)
{
variable.TestString = "testdata";
}
public interface Itest
{
string TestString { get; set; }
}
在MethodSample1
方法中看不到更改,因为引用地址是按值传递的
这不是像C中的“默认值”#所有值都是通过
价值?”
值类型是按值传递的,在您的情况下,变量
是引用类型
你应该看到
不确定为什么必须修改传递的对象,对于解决方案,可以创建属性的临时副本,然后在从方法存在之前设置该值 参数确实是按值传递的,但传递的值是对原始对象的引用 如果要保留原始对象的属性,则需要传递原始对象的副本。您可以将Clone()方法添加到接口或类似的内容:
public void MethodSample2(Itest variable)
{
variable = null;
}
或者,你可以重新考虑你目前的方法。您真的需要更改接口的属性吗?或者可以使用字符串类型的变量来代替
如何在MethodSample1中保留“TestString”的值
将其存储在局部变量中
public interface ITest
{
string TestString { get; set; }
ITest Clone();
}
public class Test : ITest
{
string TestString { get; set; }
ITest Clone() {
return new Test() {
TestString = this.TestString
};
}
}
但是,这是错误的做法。如果你再多说一点你想实现什么目标,我们可以提供更多帮助。这不是我几分钟前读到的同一个问题吗?是的,正是我想要的。。但我该如何确切地说“你需要传递一份原始对象的副本。”?@nowhohommustnotbenamed。如何复制对象是另一回事。您可以将iClonable添加到接口(或向其添加Clone()方法),这将要求接口的实现者能够克隆自己。或者,你可以重新考虑你目前的方法。您真的需要更改接口的属性吗?或者您可以使用字符串类型的变量吗?谢谢Botz。。但是,在我的项目中,我有一个方法可以接受这个接口(很抱歉,无法发布真实的示例,它太大了!)。。因此,我需要使用接口成员调用方法(使用不同的输入调用两次),但保留原始方法。你能给我一些IClone的代码示例吗?谢谢你让我知道这一点@现在他不应该被解雇。这很简单,只需创建一个新实例并复制所有属性。请参阅我答案中的编辑。感谢Habib的“您的变量是引用类型对象”。但是,我试图保留我的变量。即使这样也无济于事!请查看我更新的问题。@now他必须不命名。按照您保存它的方式,它再次将引用复制到新变量
var1
。您需要克隆它,或者简单地说,创建变量的全新副本。您当前有浅拷贝。您需要深度复制,请参阅:@nowhohosmustnotbenamed.,您可以看到:
public void MethodSample1(Itest variable)
{
variable.TestString = "some sample data";
string localTestString = variable.TestString;
Console.WriteLine(variable.TestString);
MethodSample2(variable);
variable.TestString = localTestString;
Console.WriteLine(variable.TestString);
}