返回通过引用传递的参数是否安全?

Nik*_* C. 3 c# return reference pass-by-reference

我通常使用C++,其中返回作为引用传递的函数参数可能导致问题(如悬挂引用或者可能是UB.)类似的东西在C#中是否成立?

例证:

byte[] do_something(byte[] arg)
{
    byte[] ret = null;

    // ...
    // Some of the code paths can lead to:
    ret = arg;

    // ...

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

现在上面方法的调用者做了:

byte[] array = // ...
array = do_something(array);
Run Code Online (Sandbox Code Playgroud)

这在C#中是否总是安全的,或者是否存在导致故障的情况?

Ser*_*rvy 6

如果参数是通过引用传递的,那么这将是需要考虑的事情,是的.(至少,如果你这样做,你正在返回变量的当前值的副本,你不会返回引用,所以引用语义会丢失.)如果它是一个通过值传递引用类型那么这根本不是问题.

在您的情况下,您有一个按值传递引用类型,因此返回它没有问题.

在C++中,在这种情况下,您需要关注何时应该删除传入的指针.如果调用者不知道返回的指针是否与传入的指针相同,则他们不知道是否需要推迟删除任一指针,直到完成两者的使用.当然在C#中,这是一个没有实际意义的点,因为开发人员根本不需要担心删除指针; 垃圾收集器会处理它.

如果这是一个IDisposable对象,那么你需要有点担心.如果您遇到这种情况,您需要确保处理掉所有一次性物品,并且不会丢弃任何物品.这种传递一次性物体并且自己或者可能是一个新的一次性物体的模式将是......关注.如果可能的话,它会避免这种模式.