共用方式為


對參考傳回值的支援 (Visual Basic)

C# 語言支援「參考傳回值」。 了解參考傳回值的一種方式是,它們與藉傳址傳遞至方法的引數相反。 修改藉傳址傳遞的引數時,變更會反映在呼叫者上的變數值中。 當方法將參考傳回值提供給呼叫者時,呼叫者對參考傳回值所做的修改會反映在所呼叫方法的資料中。

Visual Basic 不允許您撰寫具有參考傳回值的方法,但其確實允許您取用參考傳回值。 換句話說,您可以呼叫具有參考傳回值的方法,並修改該傳回值,而對參考傳回值所做的變更會反映在所呼叫方法的資料中。

直接修改 ref 傳回值

對於一律成功且沒有 ByRef 參數的方法,您可以直接修改參考傳回值。 您可以透過將新值指派給傳回參考傳回值的運算式來執行此動作。

下列 C# 範例定義 NumericValue.IncrementValue 方法來遞增內部值,並將它當作參考傳回值傳回。

using System;

public class NumericValue
{
   private int value = 0;

   public NumericValue(int value)
   {
      this.value = value;
   }

   public ref int IncrementValue()
   {
      value++;
      return ref value;
   }

   public int GetValue()
   {
      return value;
   }
}

接著,呼叫者會在下列 Visual Basic 範例中修改參考傳回值。 請注意,具有 NumericValue.IncrementValue 方法呼叫的程式碼行不會將值指派給方法。 相反地,它會將值指派給方法所傳回的參考傳回值。

Module Example
   Public Sub Main()
      Dim n As New NumericValue(15)
      n.IncrementValue() += 12
      Console.WriteLine(n.GetValue) 
   End Sub
End Module
' Output:   28

使用協助程式方法

在其他情況下,直接修改方法呼叫的參考傳回值,不一定是您想要的。 例如,傳回字串的搜尋方法不一定會找到相符項目。 在該案例中,您只有在搜尋成功時,才想要修改參考傳回值。

下列 C# 範例說明此案例。 其定義以 C# 撰寫的 Sentence 類別會包含 FindNext 方法,此方法可在句子中尋找下一個以指定子字串開頭的單字。 字串會以參考傳回值傳回,而參考所傳遞至方法的 Boolean 變數會指出搜尋是否成功。 參考傳回值表示除了讀取傳回的值之外,呼叫者也可以加以修改,而且該修改會反映在 Sentence 類別內部包含的資料中。

using System;

public class Sentence
{
    private string[] words;
    private int currentSearchPointer;

    public Sentence(string sentence)
    {
        words = sentence.Split(' ');
        currentSearchPointer = -1;
    }

    public ref string FindNext(string startWithString, ref bool found)
    {
        for (int count = currentSearchPointer + 1; count < words.Length; count++)
        {
            if (words[count].StartsWith(startWithString))
            {
                currentSearchPointer = count;
                found = true;
                return ref words[currentSearchPointer];
            }
        }
        currentSearchPointer = -1;
        found = false;
        return ref words[0];
    }

    public string GetSentence()
    {
        string stringToReturn = null;
        foreach (var word in words)
            stringToReturn += $"{word} ";

        return stringToReturn.Trim();
    }
}

在此情況下直接修改參考傳回值並不可靠,因為方法呼叫可能找不到相符項目,且會傳回句子中的第一個單字。 在此情況下,呼叫者會不小心修改句子的第一個單字。 可透過呼叫者傳回 null (或者在 Visual Basic 中為 Nothing) 來防止此情況。 但在此情況下,嘗試修改值為 Nothing 的字串會擲回 NullReferenceException。 如果可能也會透過呼叫者傳回 String.Empty 來防止,但這需要呼叫者定義值為 String.Empty 的字串變數。 儘管呼叫者可以修改該字串,但修改本身沒有任何作用,因為修改的字串與 Sentence 類別所儲存之句子中的單字沒有任何關聯性。

處理此案例的最佳方式是,藉傳址將參考傳回值傳遞至協助程式方法。 接著,協助程式方法會包含邏輯,以判斷方法呼叫是否成功,如果成功,則會修改參考傳回值。 下列範例提供一個可能的實作。

Module Example
   Public Sub Main()
      Dim sentence As New Sentence("A time to see the world is now.")
      Dim found = False
      Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found) 
      Console.WriteLine(sentence.GetSentence()) 
   End Sub
   
   Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _ 
                    As (originalString As String, found As Boolean) 
      Dim originalString = stringFound
      If found Then stringFound = replacement
      Return (originalString, found)   
   End Function
End Module
' The example displays the following output:
'      A good time to see the world is now.

另請參閱