2011-07-03 37 views
5

有C中的建議++:「不要返回引用到局部對象」,如下面的「C++入門」引述::永遠不會返回對本地對象的引用?

「有了解有關返回引用一個極其重要的一點:永遠不會返回到基準的局部變量。

「當一個函數完成,其中,所述局部對象所分配的存儲被釋放。函數終止後,對本地對象的引用指未定義的內存。考慮下面的函數:。

// Disaster: Function returns a reference to a local object 
const string &manip(const string& s) 
{ 
     string ret = s; 
     // transform ret in some way 
     return ret; // Wrong: Returning reference to a local object! 
} 

「,因爲它返回到本地對象的引用該函數將在運行時失敗當函數結束時,其中保留駐留被釋放存儲的返回值是指存儲器該程序已不再可用。「

問:那麼,這是否仍適用於C#?或者隨着GC的推出,這並不重要?

+1

我不同意「這一功能會在運行時失敗。」它*可能*失敗,並且不安全。但在很多情況下,存儲將在返回後的一段時間內可用,通常會使這類問題難以調試。 – abelenky

+1

abelenky是正確的;無論如何,任何事情都不會失敗。無論如何,存儲不是「被釋放」的要求。這樣做的程序可以按照你想要的方式工作 - 你可能會很幸運 - 或者它可能導致整個系統崩潰,或者它可能會擦除硬盤。它可以做*任何*。有關更多想法,請參閱http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794。 –

回答

5

不可能在.NET返回局部變量的引用

參見:Why doesn't C# support the return of references?

參見:Ref returns and ref locals (Eric Lippert's Blog)

+0

這是有點誤導錯誤。你不能通過引用返回*,但你當然可以返回* a *引用。雖然此引用不會引用本地對象。 –

+0

@Konrad魯道夫:嗯? Quote:「引用局部變量」。所以像'ref int Foo(){int x = 5; return ref x; }'。這是不可能的。在.NET中沒有「本地對象」,只是局部變量包含對由CLR管理的對象的引用。 – dtb

+0

我知道。我仍然認爲這可以更清楚地表達出來,因爲它很容易誤導,而不是僅僅在別處連接。請注意,儘管這種批評,我已upvoted你的答案... –

4

C#語言不允許。在C#中有兩個非常不同類型的引用:

1)參考文獻類和類似的「引用類型」。由於這些目標總是在堆上分配,所以引用在返回後總是有效的。

2)引用局部變量/參數。在CLR中稱爲managed references。例如:

void DoSomething(ref int i, ref object o) 

你不能聲明使用這種在C#(CLR的本身提供了一些有限的支持)參考返回類型。由於您只能將它們作爲參數傳遞給其他函數,因此無法將它們存儲在字段中,並且無法將它們返回,因此函數返回後無法保留其中的一個。所以再次使用它們是安全的。

基本上在C#中,你可以只用它們來傳遞通過定位參數。請注意,你可以有一個ref爲引用類型變量(ref object o),而不是參照參考ref ref int i

埃裏克利珀張貼在這種基準日前與細節回報ref值問題的博客條目:Ref returns and ref locals

+0

謝謝CodeInChaos – athos

相關問題