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
实际上不是一个引用:-)