>백엔드 개발 >C++ >클래스 필드에 참조 매개 변수를 할당해도 C#에서 참조가 유지되지 않는 이유는 무엇입니까?

클래스 필드에 참조 매개 변수를 할당해도 C#에서 참조가 유지되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2025-01-05 21:42:39596검색

Why Doesn't Assigning a Reference Parameter to a Class Field Maintain the Reference in C#?

C#에서 클래스 필드 참조

C#에서 매개변수를 참조로 전달하면 원래 변수를 직접 수정할 수 있습니다. 그러나 참조 매개변수를 클래스 필드에 할당하면 예상한 동작이 발생하지 않을 수 있습니다.

다음 코드를 고려하세요.

public class X
{
    public X()
    {
        string example = "X";

        new Y(ref example);
        new Z(ref example);

        System.Diagnostics.Debug.WriteLine(example);
    }
}

public class Y
{
    public Y(ref string example)
    {
        example += " (Updated By Y)";
    }
}

public class Z
{
    private string _Example;

    public Z(ref string example)
    {
        this._Example = example;
        this._Example += " (Updated By Z)";
    }
}

var x = new X();

실행 시 출력은 "X(Updated By) 예상대로 "X (Updated By Y) (Updated By Z)"가 아닌 Y)"입니다.

이는 클래스 필드에 참조 매개변수를 할당하기 때문입니다. 참조가 중단됩니다. 참조를 유지하려면 getter 및 setter를 사용하는 것이 해결책입니다.

sealed class Ref<T>
{
    private readonly Func<T> getter;
    private readonly Action<T> setter;
    public Ref(Func<T> getter, Action<T> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public T Value { get { return getter(); } set { setter(value); } }
}

Ref<int> x;
void M()
{
    int y = 123;
    x = new Ref<int>(() => y, z => { y = z; });
    x.Value = 456;
    Console.WriteLine(y); // 456 -- setting x.Value changes y.
}

이 예에서 'x'는 'y' 값을 가져오고 설정할 수 있는 개체이며, 사이의 참조를 유지합니다. 그들을. 참조 로컬 및 참조 반환 메서드는 CLR에서 지원되지만 C#에서는 아직 사용할 수 없습니다.

위 내용은 클래스 필드에 참조 매개 변수를 할당해도 C#에서 참조가 유지되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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