在被调用函数中修改的 C# 对象属性会影响调用方值



我用下面的定义定义了一个简单的类。在此示例中,我定义了一个具有单个字符串参数的简单类。然后我实例化了这个类,并为参数赋了一个值。我将该实例传递给另一个函数,而没有指定"ref"关键字。这意味着它应该通过值而不是引用传递。但我不明白的是输出显示"第二次修改"值而不是"第一次修改"的原因。

更新 1:

我认为我的问题令人困惑。我知道"参考"和"通过引用"是如何工作的。我需要知道为什么当我"按值传递"时,运行时仍然会更改原始实例的值。顺便说一句,我在建议的链接中找不到答案。

更新 2:

两年前我问过这个问题。现在我了解对象(类的实例(的所有属性都是引用类型。这意味着当我将类的实例传递给另一个方法时,它们都表现为对该类原始成员的引用。


public class MyClass
{
    public String TestProperty { get; set; }
}
public class TestClass
{
    public TestClass()
    {
        var myClass = new MyClass();
        myClass.TestProperty = "First Modification";
        MyFunction(myClass);
        Console.WriteLine(myClass.TestProperty); // Output: "Second Modification"
    }
    void MyFunction(MyClass myClass)
    {
        myClass.TestProperty = "Second Modification";
    }
}

您可以更改传递给方法的对象,但如果没有 ref 关键字,则无法更改引用本身

public class MyClass
{
    public String TestProperty { get; set; }
}
public class TestClass
{
    public TestClass()
    {
        var myClass = new MyClass();
        myClass.TestProperty = "First Modification";
        MyFunction(myClass);
        Console.WriteLine(myClass.TestProperty); // Output: "First Modification"
        MyRefFunction(ref myClass);
        Console.WriteLine(myClass.TestProperty); // Output: "Third Modification"
    }
    void MyFunction(MyClass myClass)
    {
        myClass = new MyClass() { TestProperty = "Second Modification"};
    }
    void MyRefFunction (ref MyClass myClass)
    {
        myClass = new MyClass() { TestProperty = "Third Modification"};
    }
}

如果要阻止更改属性,可以将资源库设置为非公共属性:

public String TestProperty { get; private set; }

这是预期的行为。ref 允许你做的是在 MyFunction 中创建一个新对象并将其分配给 myClass 参数,并在方法外部提供新对象。

   void MyFunction(ref MyClass myClass)
   {
     myClass = new MyClass(); //this new instance will be accessible outside the current method
   }
查看

http://msdn.microsoft.com/en-us/library/14akc2c7.aspx 了解更多详情。

最新更新