2013-11-15 118 views
3

我通常使用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#中的安全,還是有情況下,它會導致麻煩嗎?

回答

6

如果該參數是引用過去了那麼這將是值得思考的,是的。 (至少,如果你這樣做,你返回變量的當前值的副本,你不返回引用,所以引用語義都將丟失。)如果是按值傳遞一個引用類型那麼這根本就不是問題。

在你的情況下,你有一個引用類型按值傳遞,所以沒有問題返回它。

在C++中,在這種情況下,你需要關心,當你傳遞的指針應予以刪除。如果調用者不知道返回的指針是否與傳入的指針相同,他們不知道是否需要推遲刪除指針,直到完成兩者的使用。當然,在C#中這是一個有爭議的問題,因爲開發人員根本不需要擔心刪除指針;垃圾收集器會照顧它。

如果這是一個IDisposable對象,那麼你就需要有點擔心。如果您處在這種情況下,您需要確保所有的一次性物品都被丟棄,而且沒有任何物品不會被丟棄。這種通過一次性物體的模式,或者將自身或可能是一個新的可丟棄物體放回去,將會是... ...。如果可能的話,它會避免這種模式。

+0

謝謝,尤其是對於指出值傳遞引用類型。我對C#還是有點新鮮,並且不知道在這種情況下'arg'實際上並不是一個參考:-) –

相關問題