【问题标题】:Is it safe to return parameter that was passed by reference?返回通过引用传递的参数是否安全?
【发布时间】:2013-11-29 04:11:42
【问题描述】:

我通常使用 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# 中是否总是安全的,还是在某些情况下会导致麻烦?

【问题讨论】:

    标签: c# reference return pass-by-reference


    【解决方案1】:

    如果参数是通过引用传递的,那么这将是值得考虑的事情,是的。 (至少,如果您这样做是在返回变量当前值的副本,则不会返回引用,因此引用语义会丢失。)如果它是传递的 引用类型按价值计算那根本不是问题。

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

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

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

    【讨论】:

    • 感谢,特别是指出按值传递的引用类型。我对 C# 还有些陌生,不知道在这种情况下 arg 实际上不是参考 :-)
    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2023-03-21
    • 2016-09-05
    • 2021-07-16
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多