C # 속성 : 개인 필드없이 사용자 지정 집합 속성을 사용하는 방법은 무엇입니까?


95

나는 이것을하고 싶다 :

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

자동 생성 된 비공개 필드를 사용할 수 있습니까?
또는 다음과 같이 구현해야합니까?

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}

2
이 SO 질문에이 좋은 토론의 많은이 있습니다 : stackoverflow.com/questions/1277018/...은
데이비드 홀

답변:


103

getter 또는 setter에서 사용자 정의를 수행하려면 더 이상 자동 속성을 사용할 수 없습니다.


39

다음과 같이 시도 할 수 있습니다.

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}

6
+1 내 마음에이 답변은 수락 된 답변을 책망합니다. 자동 속성을 사용하고 있습니다. setter를 비공개로 명시 적으로 설정합니다. 이것은 최종 사용자 나 개발자가 setter 메서드 뒤에 더 많은 일이있을 가능성이 있다는 것을 알 수 있기 때문에 좋은 것입니다.
ooXei1sh

이것과 전혀 설정하지 않은 것의 차이점은 무엇입니까?
Sidhin S 토마스

3
@SidhinSThomas를 제공하지 않으면 private set해당 클래스의 멤버가 속성을 설정 하지 못합니다 . 엄격하게 읽기 전용입니다. 생성자에서만 데이터를 설정할 수 있습니다.
Bondolin

15

이건 불가능 해. 자동 구현 속성 또는 사용자 지정 코드입니다.


11

C # 7부터는 속성 getset접근 자에 대한 식 본문 정의를 사용할 수 있습니다 .

여기에서 더보기

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}

4
그래도 개인 필드를 사용하고 있습니다. OP에 실제로 도움이되지 않습니다.
TSmith

이것이 작동하는 동안 @TSmith가 말하는 것과 같지만 OP가 원하는 것은 아닙니다.
M. Ruiz

7

시나리오에 따라 완전히 구현해야합니다. get및 둘 다 set자동 구현되거나 둘의 조합이 아니라 함께 완전히 구현되어야합니다.

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