C# 확장 방법 및 "ref" 수정자: "this" 매개변수 뉘앙스 이해
C# 확장 메서드는 원래 코드를 변경하지 않고 새로운 기능으로 기존 유형을 향상합니다. 그러나 ref
매개변수와 함께 this
수정자를 사용할 때 특히 확장되는 인스턴스에 미치는 영향과 관련하여 중요한 차이점이 발생합니다.
ref
확장 메서드 인수의 수정자
확장 메소드는 ref
에 의해 수정된 인수를 허용하여 원래 값을 변경할 수 있습니다. 고려 사항:
<code class="language-csharp">public static void Modify(ref int x, int y) { x = y; }</code>
ref
가 일반 매개변수를 수정하므로 이는 유효합니다.
ref this
ref
매개변수에 this
을 적용할 때 제한이 발생합니다.
<code class="language-csharp">public static void ModifyExtension(this ref int x, int y) { x = y; } //Compiler Error</code>
이렇게 하면 컴파일러 오류가 발생합니다.
역사적 맥락(C# 7.2 이전)
C# 7.2 이전에는 이 제한이 컴파일러 제약 조건으로 인해 발생했습니다. 컴파일러는 this
매개변수를 다르게 처리하여 ref
의미 체계를 방지했습니다.
C# 7.2 이상: ref this
C# 7.2에서는 이 제한 사항을 해결했습니다. 이제 ref
을 this
매개변수와 함께 사용할 수 있으며, 특히 값 유형(구조체)을 수정하는 데 유용합니다.
실제 적용: 구조체 수정
이 기능은 구조체 작업 시 확장 메서드 내에서 내부 수정을 가능하게 하여 매우 유용합니다. 예:
<code class="language-csharp">public struct MyData { public string Value { get; set; } } public static class MyDataExtensions { public static void UpdateValue(this ref MyData data, string newValue) { data.Value = newValue; } }</code>
여기서 UpdateValue
는 Value
구조체의 MyData
속성을 직접 변경합니다. 이렇게 하면 새로운 구조체 인스턴스 생성이 방지되어 성능이 향상됩니다.
위 내용은 C# 확장 메서드(C# 7.2 이전)에서 'this' 매개 변수와 함께 'ref'를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!