繁体   English   中英

通过引用传递并使用ref

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM