다시 말하지만, 이 코드는 x 값을 증가시키는 것과 동일하기 때문에 결괏값은 11이다. 결과 변수를 수정하는 것뿐 아니라, 이를 참조 타입의 인수를 취하는 다른 메서드에 바로 전달할 수도 있다. 코드가 더욱 우스워 보일지 모르지만, 앞서 사용했던 데모용 코드를 재활용한다면 다음과 같이 RefReturn을 중복하여 사용할 수 있다.
RefReturn(ref RefReturn(ref RefReturn(ref x)))++;
참조 반환은 메서드뿐 아니라 인덱서에 대해서도 사용할 수 있다. 가장 일반적인 용례로는 다음 예제와 같이 참조로 배열 요소를 반환할 때를 꼽을 수 있다.
예제 13-8 배열 요소를 노출하는 인덱서에서 참조 반환 ▶ RefReturnIndexer.cs
class ArrayHolder
{
private readonly int[] array = new int[10];
public ref int this[int index] => ref array[index]; ----- 참조로 배열 요소를 반환하는 인덱서
}
static void Main()
{
ArrayHolder holder = new ArrayHolder();
➊
ref int x = ref holder[0];
ref int y = ref holder[0];
x = 20; ----- x를 이용하여 배열 요소의 값을 변경
Console.WriteLine(y); ----- y를 통해 값이 변경되었음을 확인
}
➊ 동일한 배열 요소를 참조하는 두 개의 참조 지역 변수
지금까지 C# 7.0에 포함된 새로운 기능은 모두 살펴봤다. 하지만 마이너 버전 릴리스에서 참조 관련 기능을 일부 개선한 부분이 있다. 첫 번째 기능은 이 장을 처음 작성할 때 대단히 실망했던 부분이기도 했는데, 바로 조건 ?: 연산자 지원에 대한 부분이다.