簡體   English   中英

為什么在傳遞對象(而非結構)時使用“ ref”?

[英]Why use “ref” in when passing objects (not structs)?

在記憶方面哪一個更好? 我一直使用代碼段2。無論如何,代碼段1是否比代碼段2(性能,內存)更好?

Snippet 1
public void GetListOfString(ref List<string> x)
{
    x = new List<string>(){"Dave","John"};
}


Snippet 2
public List<string> GetListOfString()
{
 return new List<string>(){"Dave","John"};

}

首先,您的第一個示例應該使用out ,而不是ref

public void GetListOfString(out List<string> x)

該方法不在乎傳入的值是什么; 它只會覆蓋那里的一切。 使用out確保了)不需要呼叫者傳遞之前,初始化變量,以及b) 需要初始化變量方法本身返回之前(這將確保針對錯誤)。


如果根本沒有任何性能差異(並且我懷疑您可以衡量一個),我希望第一個示例會比較 ,因為它必須將引用傳遞給變量。 通過引用傳遞意味着必須存在一個內存位置,該方法可以在該內存位置修改變量的值。 返回值是高度優化的方案,該值通常甚至存儲在寄存器中。 而且,如果未按引用傳遞變量,則編譯器也可以注冊調用方的變量,以提高性能。

當然,如果將數據保存在寄存器中而不是存儲在堆棧中,則這也表示了內存占用的減少(微不足道,無關緊要,完全不重要)。

但是無論如何,性能和內存占用都不應該是您的頭等大事。 最主要的關注是語義和操作上有意義的,並且在所有代碼中, 只有 99.94%是唯一的關注。 如果該方法具有需要修改呼叫者的變量,然后傳遞通過引用, refout作為適合於該情形。 如果不是,則傳遞值。 期。

請注意,如果僅需要修改調用方的一個變量,並且該方法不需要返回任何內容(即,將為void ),那么讓調用方處理修改變量是一種更好的做法,並且返回變量的新值(即在第二個示例中)。

如果並且由於某種原因到達代碼中的某個點時,您只是無法實現某些特定可測量的性能或內存占用目標,並且可以證明使用傳遞引用將確保您將實現該目標,那么您可以將績效作為通過引用的動機。 否則,請不要再三思。

片段2在可讀性和可用性方面要好得多。

就性能和內存而言,它可能也稍好一些。

但這僅僅是因為調用者被迫創建一個新列表以甚至調用代碼段1。您可能會爭辯說,編譯器將優化此開銷,但不要依賴它。

如果您用完out片段1的ref而不是ref ,那么我會說它們在性能和內存方面都是相同的。

我可以對來自不同編程語言背景的人表示同情,認為代碼片段1會更好,但是在C#中,引用類型是通過引用返回的,而不是像其他語言那樣被復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM