참조 반환 값 지원(Visual Basic)Support for reference return values (Visual Basic)

C# 7.0부터 C# 언어는 참조 반환 값을지원합니다.Starting with C# 7.0, the C# language supports reference return values. 참조 반환 값을 이해하는 한 가지 방법은 메서드에 대한 참조로 전달되는 인수의 반대입니다.One way to understand reference return values is that they are the opposite of arguments that are passed by reference to a method. 참조로 전달된 인수가 수정되면 변경 내용이 호출자의 변수 값에 반영됩니다.When an argument passed by reference is modified, the changes are reflected in value of the variable on the caller. 메서드가 호출자에게 참조 반환 값을 제공하는 경우 호출자의 참조 반환 값에 대한 수정 사항은 호출된 메서드의 데이터에 반영됩니다.When an method provides a reference return value to a caller, modifications made to the reference return value by the caller are reflected in the called method's data.

Visual Basic은 참조 반환 값을 사용하여 메서드를 작성할 수 없지만 참조 반환 값을 사용할 수 있습니다.Visual Basic does not allow you to author methods with reference return values, but it does allow you to consume reference return values. 즉, 참조 반환 값을 가진 메서드를 호출 하 고 해당 반환 값을 수정할 수 있습니다 및 참조 반환 값에 대 한 변경 내용은 호출 된 메서드의 데이터에 반영 됩니다.In other words, you can call a method with a reference return value and modify that return value, and changes to the reference return value are reflected in the called method's data.

참조 반환 값을 직접 수정Modifying the ref return value directly

항상 성공하고 매개 변수가 없는 ByRef 메서드의 경우 참조 반환 값을 직접 수정할 수 있습니다.For methods that always succeed and have no ByRef parameters, you can modify the reference return value directly. 참조 반환 값을 반환 하는 식에 새 값을 할당 하 여이 작업을 수행 합니다.You do this by assigning the new value to the expressions that returns the reference return value.

다음 C# 예제에서는 NumericValue.IncrementValue 내부 값을 증분하고 참조 반환 값으로 반환하는 메서드를 정의합니다.The following C# example defines a NumericValue.IncrementValue method that increments an internal value and returns it as a reference return value.

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 예제에서 호출자에 의해 참조 반환 값이 수정됩니다.The reference return value is then modified by the caller in the following Visual Basic example. 메서드 호출이 NumericValue.IncrementValue 있는 줄은 메서드에 값을 할당하지 않습니다.Note that the line with the NumericValue.IncrementValue method call does not assign a value to the method. 대신 메서드에서 반환 하는 참조 반환 값에 값을 할당 합니다.Instead, it assigns a value to the reference return value returned by the method.

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

도우미 방법 사용Using a helper method

다른 경우에는 메서드 호출의 참조 반환 값을 직접 수정하는 것이 항상 바람직하지 않을 수 있습니다.In other cases, modifying the reference return value of a method call directly may not always be desirable. 예를 들어 문자열을 반환하는 검색 메서드가 항상 일치하는 문자열을 찾지 못할 수 있습니다.For example, a search method that returns a string may not always find a match. 이 경우 검색이 성공한 경우에만 참조 반환 값을 수정하려고 합니다.In that case, you want to modify the reference return value only if the search is successful.

다음 C# 예제에서는 이 시나리오를 보여 줍니다.The following C# example illustrates this scenario. C#으로 Sentence 작성된 클래스에는 지정된 FindNext 하위 문자열로 시작하는 문장에서 다음 단어를 찾는 메서드가 포함되어 있습니다.It defines a Sentence class written in C# includes a FindNext method that finds the next word in a sentence that begins with a specified substring. 문자열은 참조 반환 값으로 반환되며, 메서드에 참조로 전달된 Boolean 변수는 검색에 성공했는지 여부를 나타냅니다.The string is returned as a reference return value, and a Boolean variable passed by reference to the method indicates whether the search was successful. 참조 반환 값은 반환된 값을 읽는 것 외에도 호출자는 이를 수정할 수 있으며 수정 사항이 Sentence 클래스에 내부적으로 포함된 데이터에 반영됨을 나타냅니다.The reference return value indicates that in addition to reading the returned value, the caller can also modify it, and that modification is reflected in the data contained internally in the Sentence class.

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();
    }
}

이 경우 참조 반환 값을 직접 수정하는 것은 메서드 호출이 일치를 찾지 못하고 문장의 첫 번째 단어를 반환하지 않을 수 있기 때문에 신뢰할 수 없습니다.Directly modifying the reference return value in this case is not reliable, since the method call may fail to find a match and return the first word in the sentence. 이 경우 호출자는 실수로 문장의 첫 번째 단어를 수정합니다.In that case, the caller will inadvertently modify the first word of the sentence. 이 문제는 호출자가 null (또는 Nothing Visual Basic)에서 반환하여 방지할 수 있습니다.This could be prevented by the caller returning a null (or Nothing in Visual Basic). 그러나 이 경우 값이 있는 Nothing 문자열을 수정하려고 NullReferenceException하면 .But in that case, attempting to modify a string whose value is Nothing throws a NullReferenceException. 호출자 반환에 String.Empty의해 방지될 수도 있지만 이를 위해 호출자는 값이 String.Empty있는 문자열 변수를 정의해야 합니다.If could also be prevented by the caller returning String.Empty, but this requires that the caller define a string variable whose value is String.Empty. 호출자는 해당 문자열을 수정할 수 있지만 수정된 문자열은 클래스에 저장된 문장의 단어와 Sentence 아무런 관계가 없으므로 수정 자체는 아무런 용도로 사용되지 않습니다.While the caller can modify that string, the modification itself serves no purpose, since the modified string has no relationship to the words in the sentence stored by the Sentence class.

이 시나리오를 처리하는 가장 좋은 방법은 도우미 메서드를 참조하여 참조 반환 값을 전달하는 것입니다.The best way to handle this scenario is to pass the reference return value by reference to a helper method. 그런 다음 도우미 메서드에는 메서드 호출이 성공했는지 여부를 확인하는 논리가 포함되어 있으며, 성공한 경우 참조 반환 값을 수정합니다.The helper method then contains the logic to determine whether the method call succeeded and, if it did, to modify the reference return value. 다음 예제에서는 가능한 구현을 제공합니다.The following example provides a possible implementation.

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.

참고 항목See also