按值传递接口成员

时间:2013-01-09 09:34:59

标签: c# .net visual-studio-2010 .net-4.0

    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

中保留“TestString”的值

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

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

3 个答案:

答案 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);

}

但是,这是错误的做事方式。如果你再告诉你想要达到什么目标,我们可以提供更多帮助。