我通常使用C ++,其中返回作为引用传递的函数参数可能会导致问题(如悬挂引用或者可能是UB。)类似的东西在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#中是否总是安全的,或者是否存在导致问题的情况?
答案 0 :(得分:6)
如果参数通过引用传递,那么这将是需要考虑的事情,是的。 (至少,如果你这样做,你将返回变量当前值的副本,那么你不会返回引用,因此引用语义会丢失。)如果是引用类型已经传递按值然后它根本不是问题。
在您的情况下,您有按值传递的引用类型,因此返回它没有问题。
在C ++中,在这种情况下,您需要关注何时应该删除传入的指针。如果调用者不知道返回的指针是否与传入的指针相同,则他们不知道在完成两者的使用之前是否需要推迟删除任一指针。当然在C#中,这是一个没有实际意义的点,因为开发人员根本不需要担心删除指针;垃圾收集器会处理它。
如果这是一个IDisposable
对象,那么你需要有点担心。如果您遇到这种情况,您需要确保处理掉所有一次性物品,并且不会丢弃任何物品。这种传递一次性物体并且自己或者可能是一个新的一次性物体的模式将是......关注。如果可能的话,它会避免这种模式。