我查看了类似的问题并阅读了一些文章。 THis文章有一些图片可以清楚地说明。
SomeObject so = new SomeObject();
somefunction(so);
Console.write(so.x); // will print 1
SomeObject so1 = new SomeObject();
somefunctionByRef(so1);
Console.write(so1.x); // will print 1
static void somefunction(SomeObject so)
{
so.x = 1;
}
public void somefunctionByRef(ref SomeObject so)
{
so.x = 1;
}
这两种方法对此引用类型具有相同的效果。那么为什么选择 ref
关键字作为引用类型呢?
使用 somefunction(SomeObject so) 并修改方法内的对象并期望不使用 ref 关键字进行更改是一种不好的做法(可能是错误的)吗?
最佳答案
.Net 中的默认参数传递是按值完成的。对于值类型和引用类型都是如此。不同之处在于,使用引用类型时,您将按值传递对实例的引用,而不是实际对象。
效果是原函数中的so
引用和someFunction是独立的。更改引用引用的实例不会影响另一个实例。然而,因为它们引用同一个对象,所以它们可以看到另一个对象对该对象所做的突变(这就是示例中 x 发生变化的原因)
SomeObject so = new SomeObject();
so.x = 42;
somefunction(so);
Console.Write(so.x); // will print 42
static void somefunction(SomeObject so) {
so = new SomeObject();
so.x = 13;
}
ref
修饰符导致参数通过引用而不是值传递。实际上没有引用的副本,原始函数和调用函数中的 so
是相同的引用。因此,重置一个会重置另一个
SomeObject so = new SomeObject();
so.x = 42;
somefunction(ref so);
Console.Write(so.x); // will print 13
static void somefunction(ref SomeObject so) {
so = new SomeObject();
so.x = 13;
}
关于c# - 通过引用传递和使用 ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411270/