在C#中,string是一個引用類型。然後,爲什麼我需要通過引用我的交換功能來傳遞字符串?
爲什麼我需要我的交換功能有ref參數?
swap(ref string first, ref string second) //swap(string first, string second) doesn't work
{
temp = first;
first = second
second = temp;
}
在C#中,string是一個引用類型。然後,爲什麼我需要通過引用我的交換功能來傳遞字符串?
爲什麼我需要我的交換功能有ref參數?
swap(ref string first, ref string second) //swap(string first, string second) doesn't work
{
temp = first;
first = second
second = temp;
}
是,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引用被修改。
因爲默認情況下C#中的參數是按值傳遞的,所以不能引用。添加ref
可爲您提供傳遞引用行爲。
但是,如果我創建一個自定義類的對象並將其作爲參數傳遞,我不會使用ref。不是字符串和自定義類對象是否相同?謝謝。 – Raja 2011-12-22 13:29:00
@Raja Nakka:嘗試傳遞沒有引用的對象,在方法內部將它賦值爲null,並在方法返回時檢查值。你會看到沒有參考的任何分配將不可見。 – Tudor 2011-12-22 13:31:25
@Raja:如果您創建自定義類的對象並將其作爲參數傳遞給交換函數,那麼如果您嘗試自己交換引用,則會*使用ref。但通常你最終會通過成員交換內容,就像在[Hennik's Answer](http://stackoverflow.com/a/8604821)中一樣。 – Brian 2011-12-22 20:10:47
如果將對象傳遞給方法,則傳遞的是實際對象而不是對象內存中的地址。你不能爲它分配一個新的值,因爲你會改變什麼對象存儲在其他地方的內存地址中,而不是原來的。
通過添加ref
關鍵字,您可以通過引用傳遞對象。這意味着您本質上允許方法訪問存儲對象的地址,因此當交換對象時,原始內存地址將引用交換對象。
字符串不是值類型 – 2011-12-22 13:18:51
道歉,你是正確的 - 我修改了我的答案。 – 2011-12-22 13:20:15
傳入時也不會被複制。 – Ray 2011-12-22 13:20:49
對字符串的引用是按值傳遞的。通過值傳遞引用和通過引用傳遞對象之間有很大的區別。不幸的是,在兩種情況下使用「參考」一詞。
字符串是一個引用類型。它通過默認值傳遞給方法。如果你真的想改變字符串的值,你需要通過引用來傳遞它。下面的msdn文章詳細解釋了它。 http://msdn.microsoft.com/en-us/library/s6938f28(v=vs.80).aspx
你在混淆兩種不同的參考。字符串是對實例的引用。您的交換功能需要參考變量。
想想這樣。你有兩本書,「聖誕頌歌」和「皮克威克論文」。他們是書;他們有頁面和文字以及什麼。
你有十張紙。五個說「聖誕頌歌」。五說「皮克威克論文」。論文是參考文獻。他們不是書。
你有十個抽屜,分別標記爲A,B,C,D,E,F,G,H,I,J。你把寫有「聖誕頌歌」的論文放到抽屜A到E中,說「皮克威克紙」放入抽屜F到J.
現在你想交換抽屜E和I的內容。你需要給交換器什麼信息?你不能告訴交換者「交換參考聖誕頌歌匹克威克論文」,因爲這將改變所有十個抽屜,而不僅僅是E和I.你必須給交換器的信息是「E」和「I」 。你必須參考兩個變量;變量本身包含對書籍的引用這一事實是無關緊要的。
您的交換器有三個自己的抽屜,標記爲第一,第二和溫度。它需要兩張紙。一個人說「E」,那個抽屜裏標有「第一個」。一個說「我」,那個抽屜裏寫着「第二個」。
交換器查找「第一個」並找到一個說「E」的紙。它看起來在「E」,並找到一個說「聖誕頌歌」的論文。它製作了這份文件的複印件,並將該複印件放在「臨時」中...並且你看到這裏我希望如何。
可能值得閱讀這篇文章:http://www.yoda.arachsys.com/csharp/parameters.html – 2011-12-22 13:28:43
你的困惑源於對'ref'關鍵字的錯誤理解。閱讀文章。 – Ray 2011-12-22 13:45:55
默認情況下,C#中的所有內容都是按值傳遞的。引用是按值傳遞的,所以普通的方法調用會傳遞引用的*副本*。 – 2011-12-22 19:08:15