>백엔드 개발 >C++ >C# 확장 메서드(C# 7.2 이전)에서 'this' 매개 변수와 함께 'ref'를 사용할 수 없는 이유는 무엇입니까?

C# 확장 메서드(C# 7.2 이전)에서 'this' 매개 변수와 함께 'ref'를 사용할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-07 16:41:43340검색

Why Can't

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에서는 이 제한 사항을 해결했습니다. 이제 refthis 매개변수와 함께 사용할 수 있으며, 특히 값 유형(구조체)을 수정하는 데 유용합니다.

실제 적용: 구조체 수정

이 기능은 구조체 작업 시 확장 메서드 내에서 내부 수정을 가능하게 하여 매우 유용합니다. 예:

<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>

여기서 UpdateValueValue 구조체의 MyData 속성을 ​​직접 변경합니다. 이렇게 하면 새로운 구조체 인스턴스 생성이 방지되어 성능이 향상됩니다.

위 내용은 C# 확장 메서드(C# 7.2 이전)에서 'this' 매개 변수와 함께 'ref'를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.