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 중국어 웹사이트의 기타 관련 기사를 참조하세요!