簡體   English   中英

更改方法內的引用類型(字符串)

[英]Changing reference types(strings) inside methods

我將字符串變量傳遞給方法。 我知道字符串是引用類型,但我在方法中分配的值丟失了。

public static void TestMethod(string myString)
{
    myString = "world";
}

static void Main(string[] args)
{
    string s = "hello";
    Console.WriteLine(s); // output is "hello"
    TestMethod(s);
    Console.WriteLine(s); // output is also "hello" not "world" !?
}

無論如何,例如,數組不會發生這種情況。 有人可以解釋為什么可能是原因嗎?

因為myString = "world"會為參數指定一個新字符串,而不是更新現有字符串。 要更新對字符串的原始引用,必須使用ref傳遞參數。

public static void TestMethod(ref string myString)
{
    myString = "world";
}

static void Main(string[] args)
{
    string s = "hello";
    Console.WriteLine(s); // output is "hello"
    TestMethod(ref s);
    Console.WriteLine(s); // output is also "hello" not "world" !?
}

是的,因為沒有ref(或out),您無法為參數分配新對象。 由於您沒有通過ref傳遞它,因此方法外部的變量仍然引用未更改的原始字符串。 因此,字符串是不可變的,因此在實例化后不創建新字符串就無法對其執行任何操作。

可以更改數組(或者可以更改數組的內容),因為數組中的引用不是不可變的(可以說my_object 1重新分配為“BLAH”)。 您可以替換數組中的值並使其可以在數組外部訪問,因為對方法外部的數組的引用沒有更改。

鏈接到MSDN中的字符串(談論不變性)

為此,您需要將“ref”關鍵字添加到方法簽名中的參數。

雖然您的字符串是通過引用傳遞的,但是當您將它傳遞給您的方法時,您有2個對同一字符串的引用 - Main()中的一個和TestMethod()中的一個字符串。 當您為TestMethod()中的變量分配新值時,您正在更改其引用,但不會更改Main()的變量引用的內容。

如果您只能從TestMethod()更改字符串而不是重新分配,那么您將在Main()中看到效果,但由於它們是不可變的,因此您不能使用字符串。

要進一步使用此功能,您可以嘗試以下操作 - 更改TestMethod()以接收IList並將項添加到此列表中。 您可以在從Main()傳入的變量中看到這些新項。 現在,如果您將TestMethod(IList listArg)更改為首先將listArg重新分配給新列表(即listArg = new List)然后添加項目,則Main()中的列表保持不變。 這是同樣的想法。

字符串是不可變的,這意味着您無法更改它的值,就像您對數組中的項目所做的那樣。 您只能用不同的字符串對象替換字符串對象。

如果您嘗試替換數組對象,也會發生相同的情況。 這將在參數變量中放置一個新數組,但它不會更改用於調用方法的變量,因此不會替換傳入的數組:

public static void TestMethod(string[] myArray) {
  myArray = new string[] { "world" };
}

除非使用refout關鍵字,否則始終按值傳遞參數。 對於引用類型,表示您傳遞引用的副本。

使用ref關鍵字傳遞變量,以便您可以在方法中更改它:

public static void TestMethod(ref string myString) {
  myString = "world";
}

暫無
暫無

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

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