Ref<T> 클래스
클래스는 Ref<T> 지정된 형식의 값에 대한 참조를 저장하는 스택 전용 형식입니다. 이는 ref T 값과 의미적으로 동일하지만, 다른 스택 전용 struct 형식의 필드 유형으로 사용할 수 있습니다. C#에서 현재 지원하지 않는 필드 대신 ref T 사용합니다.
플랫폼 API:
Ref<T>,ReadOnlyRef<T>
작동 방식
메모
다른 .NET Standard 계약 Ref<T> 에서 구현되는 방식 때문에 .NET Standard 1.4 및 .NET Standard 2.1(및 동등한 .NET Core 런타임)에 약간의 차이가 있습니다. 특히 .NET Standard 1.4에서는 관리되는 참조가 가리키는 임의의 값 대신 개체 내의 필드를 참조하는 데만 사용할 수 있습니다. .NET Standard 1.4에서 사용되는 기본 API에는 Span<T> 형식에 대한 기본 지원이 없기 때문입니다.
Ref<T> .NET Standard 1.4
앞에서 설명한 것처럼 .NET Standard 1.4에서는 Ref<T> 지정된 object위치 내의 위치만 가리킬 수 있습니다. 다음 코드를 생각해 봅시다.
// Be sure to include this using at the top of the file:
using Microsoft.Toolkit.HighPerformance;
// Define a sample model
class MyModel
{
public int Number = 42;
}
var model = new MyModel();
// Create a Ref<T> pointing to the MyModel.Number field
Ref<int> byRef = new Ref<T>(model, ref model.Number);
// Modify the field indirectly
byRef.Value++;
Console.WriteLine(model.Number); // Prints 43!
경고
Ref<T> 생성자는 입력 인수의 유효성을 검사하지 않으므로 해당 개체 내의 필드에 유효한 object 참조와 참조를 전달해야 합니다. 이렇게 하지 않으면 속성이 Ref<T>.Value 잘못된 참조를 반환할 수 있습니다.
Ref<T>에서 .NET Standard 2.1
.NET Standard 2.1에서 Ref<T> 다음 ref T 값을 가리킬 수 있습니다.
int number = 42;
// Create a Ref<int> pointing to 'number'
Ref<int> byRef1 = new Ref<int>(ref number);
// Modify 'number'
byRef1.Value++;
Console.WriteLine(number); // Prints 43!
경고
이 형식에는 몇 가지 주의 사항이 있으며, 인스턴스가 잘못된 참조로 만들어지면 런타임 충돌이 Ref<T> 발생할 수 있으므로 신중하게 사용해야 합니다. 특히, 현재 사용 중인 Ref<T>의 수명보다 더 긴 수명을 가진 값을 가리키는 Ref<T> 인스턴스만 생성해야 합니다. 다음 코드 조각을 고려합니다.
public static ref int GetDummyReference()
{
int number = 42;
Ref<int> byRef = new Ref<T>(ref number);
return ref byRef.Value;
}
이렇게 하면 컴파일되고 잘 실행되지만 반환된 ref int은 유효한 위치를 가리키지 않으므로 유효하지 않으며, 역참조될 경우 충돌이 발생할 수 있습니다. 새 Ref<T> 값에서 참조되는 값의 수명을 추적하는 것은 사용자의 책임입니다.
메모
nullable 참조와 함께 사용할 수 있는 래핑 값을 Ref<T>null 생성할 수 있지만, default(Ref<T>) 식을 사용하여 Ref<T> 타입은 네이티브 nullable 참조 처리 기능이 설계되지 않아 내부 참조의 유효성을 검사하는 적절한 기능을 포함하지 않습니다. 설정할 수 있는 참조를 반환해야 하는 경우 null 및 NullableRef<T> 형식을 사용하십시오.
ReadOnlyRef<T> 클래스
The ReadOnlyRef<T> 클래스는 Ref<T>을 미러링하는 스택 전용 형식이며, 생성자가 in T 대신 ref T 매개 변수(읽기 전용 참조)를 받는 점만 다릅니다. 마찬가지로 해당 Value 속성에는 ref readonly T 반환 타입이 있으며, 이는 ref T 대신입니다.
예제
단위 테스트에서 더 많은 예제를 찾을 수 있습니다.
.NET Community Toolkit