按值传递接口成员

now*_*ed. 2 .net c# .net-4.0 visual-studio-2010

    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; }
    }
Run Code Online (Sandbox Code Playgroud)

预计两个控制台输出行都打印"一些样本数据",但似乎TestString是被新值覆盖了?是不是"默认情况下在C#中所有的值都按值传递?".

总之,如何保存"TestString"的值MethodSample1

(我遇到了这个问题,因为我的所有项目都基于单个界面)

即使保留了价值,它确实反映了!奇怪!

Hab*_*bib 5

对于您当前的问题,我认为您不能阻止任何方法修改传递给它的参数.

variable是一个引用类型对象,在C#引用类型的地址通过值传递给方法,这就是您看到更改的原因.例如,如果您的方法编写如下:

public void MethodSample2(Itest variable)
{
    variable = null;
}
Run Code Online (Sandbox Code Playgroud)

不会看到的变化在你的MethodSample1方法,因为参考地址是按值传递.

是不是"默认情况下在C#中所有的值都按值传递?".

值类型按值传递,在您的情况下variable是引用类型.

您应该看到Jon Skeet的参数传递C#

不确定为什么必须修改传递的对象,为了解决方法, 您可以创建属性的临时副本,然后在方法存在之前设置该值.

  • @nowhewhomustnotbenamed.,你保留它的方式,它再次复制对新变量`var1`的引用.你需要克隆它,或者用简单的话来创建一个全新的变量副本.你目前有浅拷贝.您需要深层复制,请参阅:http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy (2认同)