> 백엔드 개발 > C++ > C#에서 필드가 참조를 보유하는 것을 허용하지 않는 이유는 무엇이며 대안은 무엇입니까?

C#에서 필드가 참조를 보유하는 것을 허용하지 않는 이유는 무엇이며 대안은 무엇입니까?

DDD
풀어 주다: 2025-01-06 03:12:39
원래의
729명이 탐색했습니다.

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

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 Y)(Updated By Z)"이지만 대신 "X(Updated By Y)"만 인쇄됩니다. 이 동작은 필드에 "ref 매개변수"를 할당하면 참조가 손실되기 때문에 발생합니다.

왜 필드가 참조를 보유할 수 없나요?

다음과 같은 경우 가능한 옵션은 세 가지뿐입니다. "ref type" 필드 고려:

  1. ref 필드를 허용하지 않음 유형: 이는 C#의 현재 동작입니다.
  2. ref 유형의 안전하지 않은 필드 허용: 이렇게 하면 안전하지 않은 메모리에 액세스할 가능성이 허용되어 잠재적으로 예측할 수 없는 동작이 발생할 수 있습니다.
  3. 스택 외부에 지역 변수 저장: 이는 지역 변수를 임시 메모리에 저장하는 최적화를 방해합니다. 바람직하지 않은 풀입니다.

프로그램 안정성을 보장하고 코드의 시한폭탄 생성을 방지하기 위해 옵션 1을 선택했습니다.

Reference-Like를 달성하는 방법 동작

참조 유형의 필드를 가질 수는 없지만 참조 유형을 달성하는 대체 방법이 있습니다. 동작:

  • 참조를 캡슐화하는 클래스 생성: 참조된 변수에 액세스하고 수정하기 위한 getter 및 setter 메서드를 제공하는 클래스를 생성할 수 있습니다. 이는 다른 변수를 참조하는 간접적인 방법입니다.
  • C# 7 기능 사용(참조 로컬 및 참조 반환 방법): C#은 필드에 참조 저장을 지원하지 않지만 참조 로컬은 지원합니다. 및 참조 반환 방법. 이를 통해 참조로 전달되고 여러 방법으로 수정될 수 있는 ref 변수를 생성할 수 있습니다.

위 내용은 C#에서 필드가 참조를 보유하는 것을 허용하지 않는 이유는 무엇이며 대안은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿