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; }
}
预计两个控制台输出行都会打印“一些示例数据”,但似乎TestString
被新值覆盖了?是不是“默认情况下在C#中所有的值都按值传递?”。
简而言之,如何在MethodSample1
?
(我遇到了这个问题,因为我的所有项目都基于单个界面)
即使保留了价值,它确实反映了!奇怪!
答案 0 :(得分:5)
对于您当前的问题,我认为您不能阻止任何方法修改传递给它的参数。
您的variable
是引用类型对象,在C#中,引用类型的地址按值传递给方法,这就是您看到更改的原因。例如,如果您的方法编写如下:
public void MethodSample2(Itest variable)
{
variable = null;
}
您的{strong>将无法在MethodSample1
方法中看到更改,因为参考地址是按值传递的。
是不是“默认情况下在C#中传递的所有值都是 值?”。
值类型按值传递,在您的情况下,variable
是引用类型。
您应该看到Parameter Passing C# by Jon Skeet
不确定为什么必须修改传递的对象,对于解决方法,您可以创建属性的临时副本,然后在方法存在之前设置该值。
答案 1 :(得分:2)
参数确实是按值传递的,但是您传递的值是原始对象的引用。
如果要保留原始对象的属性,则需要传递原始对象的副本。您可以将Clone()方法添加到接口或类似的东西:
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
};
}
}
或者,您可以重新考虑您当前的方法。你真的需要改变界面的属性吗?或者你可以使用字符串类型的变量吗?
答案 2 :(得分:1)
如何在MethodSample1中保留“TestString”的值?
将其存储在本地变量中。
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);
}
但是,这是错误的做事方式。如果你再告诉你想要达到什么目标,我们可以提供更多帮助。