我用下面的定义定义了一个简单的类。在此示例中,我定义了一个具有单个字符串参数的简单类。然后我实例化了这个类,并为参数赋了一个值。我将该实例传递给另一个函数,而没有指定"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 了解更多详情。