>백엔드 개발 >C++ >C# 확장 메서드의 첫 번째 매개 변수가 `ref` 매개 변수가 될 수 없는 이유는 무엇입니까?

C# 확장 메서드의 첫 번째 매개 변수가 `ref` 매개 변수가 될 수 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-07 16:57:421045검색

Why Can't the First Parameter of a C# Extension Method Be a `ref` Parameter?

C# 확장 방법: 첫 번째 매개변수가 ref(대부분)

이 될 수 없는 이유

확장 메소드는 소스 코드를 변경하지 않고도 기존 유형에 기능을 우아하게 추가합니다. 그러나 중요한 제한 사항이 있습니다. 첫 번째 매개 변수(메서드가 작동하는 인스턴스를 나타냄)는 ref 매개 변수가 될 수 없습니다(아래 예외는 제외).

제한 사유

ref 키워드를 사용하면 메소드가 인수로 전달된 변수의 값을 직접 수정할 수 있습니다. 표준 메서드 호출에서는 이는 완벽하게 허용됩니다. 그러나 확장 메서드를 사용하면 첫 번째 매개 변수는 확장이 호출되는 개체를 암시적으로 나타냅니다. 이 매개변수를 ref로 설정하면 확장 메서드의 작동 방식이 근본적으로 변경됩니다.

확장 메소드는 유형의 동작을 확장합니다. 새 인스턴스를 대체하거나 생성하지 않습니다. 첫 번째 인수에 ref 매개변수를 허용하면 확장 메서드가 원래 개체를 완전히 다른 개체로 효과적으로 대체하여 확장 메서드의 핵심 개념을 깨뜨릴 수 있습니다.

예시

일반적인 방법을 고려해보세요:

<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Directly replaces the original object
}</code>

이제 유사한 확장 방법을 상상해 보십시오(가설적으로 허용됨).

<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Would replace the original object
}</code>

이 가상 확장 방법은 원본 obj을 수정하지 않고 대신 이를 참조하는 변수에 새 개체를 할당합니다. 이 동작은 확장 메서드의 의도된 목적과 일치하지 않습니다.

C# 7.2 및 값 유형: 예외

참조 유형(클래스, 인터페이스)에는 일반적으로 제한이 적용되지만 C# 7.2에서는 값 유형(구조체)에 대한 예외를 도입했습니다. 구조체의 경우 첫 번째 매개변수에 ref을 사용하는 것이 허용됩니다.

이를 통해 구조체의 내부 상태를 수정할 수 있는 확장 메서드를 만들 수 있습니다. 그러나 이 예외는 참조 유형이 아닌 값 유형에만 적용된다는 점을 기억하는 것이 중요합니다. 원본 인스턴스를 보존하는 핵심 원칙은 참조 유형에 남아 있습니다.

위 내용은 C# 확장 메서드의 첫 번째 매개 변수가 `ref` 매개 변수가 될 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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