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


79

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

public class MyClass
{
    private int _age;

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

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

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

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

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


10
이 경우 개인 액세스와 공개 액세스의 차이점은 무엇입니까? 선언 클래스의 논리에서도 공용 접근 자에 액세스하는 것이 가장 좋은 방법이라고 생각합니다. 접근 자에 로직을 추가했다면 모든 코드를 변경할 필요가 없습니다.
Eric Schoonover

@ spoon16 접근 자에 로직을 추가하고 결과적으로 모든 코드를 변경해야하는 예를 들어 주시겠습니까? 나는이 부분을 정말로 이해하지 못했다.
Ogen

답변:


92

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

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

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

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

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


사실입니다. 그들은 볼러 플레이트 코드를 줄이며 테스트에 필요한 것을 줄여 준다고 광고 할 것입니다. 일부는 프레임 워크를 신뢰할 수 있기 때문에 자동 속성이 아닌 수동 get / set을 테스트해야한다고 주장 할 수 있습니다.
Daniel Auger

3
여기 코드 샘플이 잘못되었습니다. public class MyClass {public int Age {get; private set;}}이 답변에 동의합니다. 개인 필드에 액세스 할 수 없으며 필요한 경우 먼저 자동 속성을 사용하지 않아야합니다.
hwiechers

hwiechers, 고마워요-그 편집이 있었지만 포맷을 고치려고 할 때 붙여 넣기를 다시 눌러서 잘못된 코드 블록을 삭제 했어야합니다. 도!
Wilka

POCO 개체에서 일반적으로 사용
RobS

23

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

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

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

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

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


클래스에 복잡한 논리를 추가하면 해당 클래스 내에서 자동 속성을 사용했는지 여부에 영향을 미치는 이유는 무엇입니까?
Eric Schoonover

좀 더 일관성있는 것 ... 복잡한 논리를 가지고 있다면 OO 관행에 따라 private backing 변수에서 접근하고 싶을 것입니다. 그리고 자동 속성을 사용한다면 ... 그러한 속성에 접근하는데 불일치가있을 것입니다. . 일부는 밑줄 접두사가 있고 일부는 그렇지 않기 때문입니다.
chakrit

12

이 구문은 일반적으로 "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 # 컴파일러의 향후 릴리스에서 언제든지 변경 될 수있는 구현 세부 사항에 의존하기 때문에 여기에서 말할 것입니다.


10

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

에서 C # 3.0 자동 속성 설명

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


7

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


1
나는 항상 자동 속성의 요점이 무엇인지 궁금했습니다. 게터와 세터에 특별한 논리가 없다면 왜 그것들을 가지고 있습니까?
Matthew Lock

4
@MatthewLock 유연성. 직접 현장 액세스를 사용하면 모든 클라이언트 코드를 동시에 변경하지 않는 한 해당 설계에 고정됩니다. 그러나 속성을 사용하여 "의사 필드"에서 계산 된 속성으로 변경하거나 setter에 대한 단언 및 검사를 추가하기로 결정한 경우 투명하게 수행 할 수 있습니다. 이는 모든 클라이언트 코드를 제어 할 수없는 라이브러리 코드를 작성하는 경우 더욱 유용합니다.
Wedge

2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.