2
    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# 中所有值都是按值传递的?”。

简而言之,如何保存“TestString”中的值MethodSample1

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

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

4

3 回答 3

5

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

variable是一个引用类型对象,在 C# 中,引用类型的地址是按值传递给一个方法的,这就是你看到变化的原因。例如,如果您的方法编写如下:

public void MethodSample2(Itest variable)
{
    variable = null;
}

不会看到方法的变化MethodSample1因为引用地址是按值传递的。

是不是像“默认情况下在 C# 中所有值都是按值传递的?”。

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

你应该看到Jon Skeet 的 Parameter Passing C#

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

于 2013-01-09T09:37:32.657 回答
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 
        }; 
    }
}

或者,您可以重新考虑当前的方法。你真的需要改变接口的属性吗?或者您可以改用字符串类型的变量吗?

于 2013-01-09T09:37:45.227 回答
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);

}

但是,这是错误的做事方式。如果您多说一点您想要实现的目标,我们可以提供更多帮助。

于 2013-01-09T09:39:55.213 回答