[c#] 자동 구현 속성의 지원 변수에 액세스하려면 어떻게해야합니까?

과거에는 다음과 같은 속성을 선언했습니다.

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

이제 다음을 수행 할 수 있습니다.

public class MyClass
{
    public int Age {get; set;}
}

제 질문은이 표기법을 사용하여 자동으로 생성 된 개인 변수에 어떻게 액세스 할 수 있습니까?

차라리 공개 접근 자 ‘Age’가 아닌 개인 변수에 액세스하고 싶습니다. 개인 변수에 액세스하는 기본 표기법이 있습니까? 아니면 불가능합니까?



답변

새로운 자동 속성의 목표는 get 또는 set에 특별한 논리가 필요하지 않은 단순한 속성이있을 때 작성해야하는 상용구 코드의 양을 줄이는 것입니다.

이러한 속성이 사용하는 개인 멤버에 액세스하려는 경우 일반적으로 몇 가지 이유가 있습니다.

  • 단순한 get / set 이상이 필요합니다.이 경우이 멤버에 대한 자동 속성을 사용하지 않아야합니다.
  • get 또는 set를 거치는 성능 저하를 피하고 멤버를 직접 사용하고 싶습니다.이 경우 실제로 성능 저하가 발생하면 놀랄 것입니다. 간단한 get / set 멤버는 인라인하기가 매우 쉬우 며 내 (제한적으로 제한됨) 테스트에서 자동 속성을 사용하는 것과 멤버에 직접 액세스하는 것의 차이를 발견하지 못했습니다.
  • 공용 읽기 액세스 (예 : ‘get’) 만 가져오고 클래스가 멤버에 직접 쓰기를 원합니다.이 경우 자동 속성에서 개인 집합을 사용할 수 있습니다. 즉

    public class MyClass
    {
        public int Age {get; private set;}
    }

일반적으로 자동 속성에서 사용하는 지원 필드로 직접 이동하려는 대부분의 이유를 다룹니다.


답변

자동 속성을 사용하면 속성에 대한 가져 오기 / 설정 논리가 필요하지 않으므로 개인 지원 변수가 필요하지 않습니다.

클래스에 복잡한 논리가있는 경우 자동 속성을 사용하지 마십시오. private int _age평소처럼 일반적인 게터 / 세터로 이동하십시오 .

IMO, 자동 속성은 다음과 같은 일회용 객체 또는 임시 데이터 캡슐을 빠르게 구현하는 데 더 적합합니다.

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

많은 논리가 필요하지 않은 곳.


답변

이 구문은 일반적으로 “syntax sugar”라고 불리며, 이는 컴파일러가 해당 구문을 가져 와서 다른 것으로 변환 함을 의미합니다. 귀하의 예에서 컴파일러는 다음과 같은 코드를 생성합니다.

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

심지어이 모든 것을 알고, 당신은 할 수 아마도 직접 백업 필드하지만 패배 그런 종류의 자동 속성을 사용하는 목적에 액세스 할 수 있습니다. 아마도 C # 컴파일러의 향후 릴리스에서 언제든지 변경 될 수있는 구현 세부 사항에 의존하기 때문에 여기에서 말할 것입니다.


답변

이면에서 일어나는 일은 <> k__AutomaticallyGeneratedPropertyField # 접두사가 붙은 개인 멤버 변수를 주입하는 것입니다.

에서 C # 3.0 자동 속성 설명

해당 개인 멤버를 직접 사용할 수는 있지만 매우 해키하고 불필요합니다.


답변

그렇게해서는 안되며 그럴 필요가 거의 없습니다. 속성에 액세스해야하는 경우 공용 속성 (예 : this.Age)을 사용하십시오. 공공 재산을 뒷받침하는 사유지에는 특별한 것이 없으며, 재산보다 우선적으로 사용하는 것은 미신 일뿐입니다.


답변

그럴 수 없습니다. IDE 기능이 아닌 언어 기능입니다. 솔직히 말해서 IDE가 개인 변수를 추가하는 것을 선호합니다. 클래스가 내부적으로 자신의 변수에 액세스하기 위해 공개 진입 점을 사용해야하는 것이 약간 이상하다는 데 동의합니다. 따라서 나는이 새로운 기능을 그다지 많이 사용하지 않습니다.


답변