2012-11-21 7 views
-1

내가 자동 속성에 엄청나게 많은 기사를 읽고 다음 예와 같이 일을하지 않는 이유를 가지고 올 수 없습니다 설정합니다. 나는 여기에 뭔가 빠져있다. 즉,이 예제에서 일반 속성을 사용해야하는 이유가 무엇입니까? 나는 그것을 정기적으로하고 잘 작동합니다.C# 자동 등록

여기 StackOverflow (C#3.0 Automatic properties with extra logic)의 다른 스레드에서 "아니요, 자동 구현 된 속성에는 선언 된 구현이 없습니다."라고 대답 한 경우 제공하려는 확장 구현에는 일반 속성을 사용해야합니다. "

class Foobar 
{ 
    public string Description { get; set; } 
    public bool Scary { get; private set; } 

    public void Describe(int size) 
    { 
     if (size <= 3) 
     { 
      switch (size) 
      { 
       case 1: 
        Description = "Cute"; 
        Scary = false; 
        break; 
       case 2: 
        Description = "Interesting"; 
        Scary = false; 
        break; 
       case 3: 
        Description = "Interesting"; 
        Scary = false; 
        break; 
      }     
     } 
     else if (size > 4 && size < 10) 
     { 
      Description = "I'm sweating!"; 
      Scary = true; 
     } 
     else 
     { 
      Description = "I'm outta here - every man for himself"; 
      Scary = true; 
     } 
    } 
} 
+0

당신이 게시 코드는 나에게 잘 보인다. 다른 스레드가 "자동 속성에 논리를 추가하면 더 이상 자동으로는 안됩니다."라고 말한 것 같습니다. – StingyJack

+0

나는 당신의 질문에서 당신이 염려하고있는 아이디어/개념을 이해할 수 없다. –

+0

나는 문제가 무엇인지 모르겠다. – MikeSW

답변

2

당신은 당신의 속성에 대한 GET/set 메소드에 코드를 추가하지 않을 경우 가져 오기/속성 설정을 사용하는 클래스에 완전히 별도의 방법을 추가하고 있습니다.

누군가 Description 또는 Scary에 대한 설정 방법을 Describe 대신 직접 사용하면 사용자 지정 논리가 실행되지 않습니다. 예를 들어 누군가가 수행하지 못하도록 막는 것은 없습니다. obj.Describe(10); obj.Description = "Cute";. 이러한 속성에 대해 set 메서드를 오버로드하면 누군가가 이렇게 귀엽고 무서운 개체를 만들지 못하게 할 수 있습니다.

당신이 연결 한 질문에 대한 대답은 완벽하게 정확; 자동 구현 된 속성의 get/set 메서드에 유효성 검사를 추가 할 수 없습니다. 원하는 경우 get/set 메서드를 명시 적으로 정의해야합니다.

+0

동의합니다. 'Description'의 설정자도 비공개이어야합니다. – Khan

+0

@Jeff 또한 setter에 논리를 추가하면 클래스 정의의 다른 메소드에서 잘못 사용되는 것을 방지 할 수 있습니다. 그것은 바람직하지 않을 수도 있습니다. – Servy

+0

감사합니다. 당신이 맞다고 가정하면 그것이 내가 읽은 첫 번째 설명이 나에게 의미가 있습니다. – GDB

1

당신이 게시 한 코드가 자동으로 구현 된 속성을 사용합니다, 그리고 괜찮습니다.

그것은 논리적 것을 이해하는 것이 중요합니다, 당신의 자동 속성이 같은 동일합니다 :이 가 "당신이 제공하고자하는 모든 확장 구현해야하는 이유 이해하는 데 매우 중요하다 이해 생각

private string _description; 
public string Description 
{ 
    get { return _description; } 
    set { _description = value; } 
} 

private bool _scary; 
public bool Scary 
{ 
    get { return _scary; } 
} 

일반 재산을 사용하십시오. "

자동 속성은 위에서 무엇을 논리적으로 동일 할 수있다. 즉, 자동 속성은 그대로입니다. 위의 코드와 동일한 축약 형입니다. 당신이 당신의 속성에 추가 또는 다른 로직을 포함하고 싶다면

그래서, 당신은 자동 속성을 사용할 수 없습니다.


class Foobar 
{ 
    private int _size; 

    public string Description 
    { 
     get 
     {  
      if (_size == 1) 
      { 
       return "Cute"; 
      } 
      else if (_size < 4) 
      { 
       return "Interesting"; 
      } 
      else if (_size < 10) 
      { 
       return "I'm sweating!"; 
      } 
      else 
      { 
       return "I'm outta here - every man for himself"; 
      } 
     } 
    } 

    public bool Scary 
    { 
     get 
     { 
      return _size > 3; 
     } 
    } 

    public Foobar(int size) 
    { 
     _size = size; 
    } 
} 

:

예를 들어, 클래스 (이 의미하는 것은 아니다 "수"기억 "해야한다") 모두 함께 멀리 Describe 방법으로 수행하고 속성으로 모든 로직을 캡슐화 리팩토링 할 수 그러나 그렇게했다면 단순한 get/set보다 더 많은 로직이 필요하기 때문에 자동 속성을 사용할 수 없습니다.

자동 속성을 언제/어떻게 사용하는지 배우는 중이라면 "정상적인"속성을 작성하여 시작하는 것이 좋습니다. 그런 다음 백업 변수를 가져 오거나 설정하는 경우 리팩터링을 통해 자동 속성을 사용할 수 있습니다.