簡體   English   中英

C# 通過值/引用傳遞?

[英]C# pass by value/ref?

常見問題,但我可以使用“英語”解釋。

是不是像 Java 那樣

Cat myCat

實際上是一個指向Cat的指針?

我真的應該在 C# 中創建復制構造函數嗎?


我知道我們是通過值傳遞,但現在我的問題是我們是通過指針值還是對象的完整副本傳遞?

如果是后者,那在性能/內存方面是不是太昂貴了? 那是你必須使用 ref 關鍵字的時候嗎?

正如@rstevens 回答的那樣,如果它是一個類,則 myCat 是一個參考。 但是如果你將 myCat 傳遞給一個方法調用,那么引用本身是按值傳遞的——即參數本身將引用同一個對象,但它是一個全新的引用,所以如果你將它分配給 null,或者創建一個新對象,舊的 myCat 引用仍將指向原始對象。

SomeMethod(myCat);

void SomeMethod(Cat cat)
{
    cat.Miau(); //will make the original myCat object to miau
    cat = null; //only cat is set to null, myCat still points to the original object
}

Jon Skeet 有一篇關於它的好文章

請記住,指針與引用並不完全相同,但如果您願意,您可以這樣想。

我發誓我不是在 10 分鍾前看到另一個 SO 問題,但我現在找不到鏈接。 在我看到的另一個問題中,他們在談論通過 ref 和按值傳遞參數,歸結為:

默認情況下,在 .Net 中,您不通過引用傳遞對象。 您按值傳遞對對象的引用。

區別很微妙但很重要,特別是如果,例如,您想分配給方法中傳遞的對象。

如果您將 Cat 聲明為

class Cat {...}

那么它是。

如果您將 Cat 聲明為

struct Cat {...}

那么你的變量“就是”結構本身。

這是 .Net 中引用類型和值類型之間的區別。

是的,它是關於指針,但不是真的......最初讓我感到困惑的是,它並不是真正關於保護您的變量免受方法內的更改。 如果在方法中更改對象,則這些更改對外部方法可見,無論它是否在“ref”中傳遞。

區別(據我所知)是如果您更改變量引用的對象,您發送的變量是否更新了其引用。 所以給出這個方法

public void DoSomething(ref CoolShades glasses)
{
    glasses.Vendor = "Ray Ban";
    glasses = new CoolShades();
}

您作為參數傳入的變量現在包含對新 CoolShades 的引用,而不是它之前引用的任何對象。 無論你是否傳遞了參數 ref,原始參數對象的 Vendor 屬性都會更改為“Ray Ban”。

暫無
暫無

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

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