C# 返回通过引用传递的参数是否安全? 我通常使用C++,其中返回作为引用传递的函数参数会导致问题(比如悬空引用或也许是UB)。

C# 返回通过引用传递的参数是否安全? 我通常使用C++,其中返回作为引用传递的函数参数会导致问题(比如悬空引用或也许是UB)。,c#,reference,return,pass-by-reference,C#,Reference,Return,Pass By Reference,例如: byte[] do_something(byte[] arg) { byte[] ret = null; // ... // Some of the code paths can lead to: ret = arg; // ... return ret; } 现在,上述方法的调用方执行以下操作: byte[] array = // ... array = do_something(array); 这在C#中是否总是安全的,或者是

例如:

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

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

    // ...

    return ret;
}
现在,上述方法的调用方执行以下操作:

byte[] array = // ...
array = do_something(array);
这在C#中是否总是安全的,或者是否存在导致问题的情况?

如果参数是通过引用传递的,那么这将是需要考虑的,是的。(至少,如果您这样做是返回变量当前值的副本,那么您没有返回引用,因此引用语义将丢失。)如果它是按值传递的引用类型,那么这根本不是问题

在本例中,您有一个按值传递的引用类型,因此返回它没有问题

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


如果这是一个
IDisposable
对象,那么您需要有点担心。如果你处于这种情况,你需要确保所有的一次性物品都被处理掉,而没有一件永远不会被处理掉。这种传递一次性物品并将其自身或新的一次性物品取回的模式将……令人担忧。如果可能的话,它将避免这种模式。

谢谢,特别是指出了通过值传递的引用类型。我对C还是有点陌生,不知道在这种情况下,
arg
实际上不是一个引用:-)