2011-12-22 23 views
2

在C#中,string是一個引用類型。然後,爲什麼我需要通過引用我的交換功能來傳遞字符串?

爲什麼我需要我的交換功能有ref參數?

swap(ref string first, ref string second) //swap(string first, string second) doesn't work 
{ 
    temp = first; 
    first = second 
    second = temp; 
} 
+3

可能值得閱讀這篇文章:http://www.yoda.arachsys.com/csharp/parameters.html – 2011-12-22 13:28:43

+0

你的困惑源於對'ref'關鍵字的錯誤理解。閱讀文章。 – Ray 2011-12-22 13:45:55

+0

默認情況下,C#中的所有內容都是按值傳遞的。引用是按值傳遞的,所以普通的方法調用會傳遞引用的*副本*。 – 2011-12-22 19:08:15

回答

3

是,string是引用類型和該

void swap(string first, string second) 

傳遞到string對象的功能的引用。 但string是不可變的,因此交換功能不可能通過這些引用來更改對象。對於字符串,實現交換功能的唯一方法是使用ref關鍵字通過引用傳遞引用,以便引用可以交換。

OTOH,如果你有一個可變類,你可以寫一個交換功能,而無需使用ref關鍵字:

class Foo 
{ 
    public int Bar { get; set; } 
} 

static void Swap(Foo first, Foo second) 
{ 
    var temp = first.Bar; 
    first.Bar = second.Bar; 
    second.Bar = temp; 
} 

Foo foo1 = new Foo { Bar = 1 }; 
Foo foo1Copy = foo1; 
Foo foo2 = new Foo { Bar = 2 }; 
Swap(foo1, foo2); 

但請注意,該交換,foo1Copy.Bar == 2,因爲對象後被foo1和foo1Copy引用被修改。

3

因爲默認情況下C#中的參數是按值傳遞的,所以不能引用。添加ref可爲您提供傳遞引用行爲。

+0

但是,如果我創建一個自定義類的對象並將其作爲參數傳遞,我不會使用ref。不是字符串和自定義類對象是否相同?謝謝。 – Raja 2011-12-22 13:29:00

+0

@Raja Nakka:嘗試傳遞沒有引用的對象,在方法內部將它賦值爲null,並在方法返回時檢查值。你會看到沒有參考的任何分配將不可見。 – Tudor 2011-12-22 13:31:25

+0

@Raja:如果您創建自定義類的對象並將其作爲參數傳遞給交換函數,那麼如果您嘗試自己交換引用,則會*使用ref。但通常你最終會通過成員交換內容,就像在[Hennik's Answer](http://stackoverflow.com/a/8604821)中一樣。 – Brian 2011-12-22 20:10:47

0

如果將對象傳遞給方法,則傳遞的是實際對象而不是對象內存中的地址。你不能爲它分配一個新的值,因爲你會改變什麼對象存儲在其他地方的內存地址中,而不是原來的。

通過添加ref關鍵字,您可以通過引用傳遞對象。這意味着您本質上允許方法訪問存儲對象的地址,因此當交換對象時,原始內存地址將引用交換對象。

+5

字符串不是值類型 – 2011-12-22 13:18:51

+0

道歉,你是正確的 - 我修改了我的答案。 – 2011-12-22 13:20:15

+3

傳入時也不會被複制。 – Ray 2011-12-22 13:20:49

3

對字符串的引用是按值傳遞的。通過值傳遞引用和通過引用傳遞對象之間有很大的區別。不幸的是,在兩種情況下使用「參考」一詞。

7

你在混淆兩種不同的參考。字符串是對實例的引用。您的交換功能需要參考變量

想想這樣。你有兩本書,「聖誕頌歌」和「皮克威克論文」。他們是書;他們有頁面和文字以及什麼。

你有十張紙。五個說「聖誕頌歌」。五說「皮克威克論文」。論文是參考文獻。他們不是書。

你有十個抽屜,分別標記爲A,B,C,D,E,F,G,H,I,J。你把寫有「聖誕頌歌」的論文放到抽屜A到E中,說「皮克威克紙」放入抽屜F到J.

現在你想交換抽屜E和I的內容。你需要給交換器什麼信息?你不能告訴交換者「交換參考聖誕頌歌匹克威克論文」,因爲這將改變所有十個抽屜,而不僅僅是E和I.你必須給交換器的信息是「E」和「I」 。你必須參考兩個變量;變量本身包含對書籍的引用這一事實是無關緊要的。

您的交換器有三個自己的抽屜,標記爲第一,第二和溫度。它需要兩張紙。一個人說「E」,那個抽屜裏標有「第一個」。一個說「我」,那個抽屜裏寫着「第二個」。

交換器查找「第一個」並找到一個說「E」的紙。它看起來在「E」,並找到一個說「聖誕頌歌」的論文。它製作了這份文件的複印件,並將該複印件放在「臨時」中...並且你看到這裏我希望如何。

相關問題