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

}