[英]Passing by reference and using ref
我看了类似的问题并阅读了一些文章。 本文章有一些照片,这使得它明确。
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;
}
我只在处理非引用类型(例如int,decimal等)时使用ref。
看看这个MSDN页面 ,可以得到更清晰的解释和一些陷阱。
类已经通过引用传递(以非托管的术语,因此是指向对象的指针)。 传递引用可让您更改基础变量(正在使用指向指针的指针)。 采取以下代码:
static void foo(SomeObject so)
{
so.x = 1;
so = null;
}
static void bar(ref SomeObject so)
{
so.x = 1;
so = null;
}
SomeObject so1 = new SomeObject();
foo(so1);
Console.write(so1.x); // will print 1
bar(so1);
Console.write(so1.x); // crash
第一个方法将起作用,并且您将打印出1 -分配为null只会更改该函数本地的变量。 第二个将导致崩溃(NullReferenceException),因为so1已设置为null。
对于引用类型,默认情况下参数通过引用传递,除非指定为通过值传递。 我认为这是大多数.Net开发人员都应该知道的足够安全的假设。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.