2012-10-06 3 views
3

다음 getter 및 setter를 사용하여 속성 i를 만들려고합니다. 나는 시도했다 :이 때C# getter/setter pairs

int i { 
     get{ 
      return i; 
     } 
     set { 
      if (value > 60) { 
      } else { 
       i = value; 
      } 
     } 

    } 

그러나, 나는 스택 오버플로 오류가 나는 코드를 실행하려고 할 때. 내 코드에 문제가 있습니까? 어떤 Assistane도 감사 할 것입니다.

답변

4

이를 수행

private int i; // backing field 

int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) { 
     } else 
     { 
      i = value; 
     } 
    } 
} 

이렇게하지 않으면

, 당신의 코드가 순환 상태에 따라서 StackOverflow 오류가 유지됩니다.

5

부동산에 어떤 종류의 로직이 있다면 (그렇지 않으면 자동 속성을 사용하는 방법) 백킹 필드가 필요합니다. 현재는 setter 코드를 다시 호출하는 속성 자체에 지정합니다 (getter와 마찬가지로) - 그 Stackoverflow 예외가 발생합니다.

예 :

private int _i; 
public int SomeProperty 
{ 
    get{ return _i;} 
    set 
    { 
    //your logic here 
    _i = value; 
    } 
} 
2

그것의이 방법

private int i = 0; 
public int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) 
     { 
     } 
     else 
     { 
      i = value; 
     } 
    } 
} 

  • 개인 필드가 들어 LocalVariable 가운데
  • 처럼 낙타 케이스입니다

    1. 재산권이 MyProperty
    2. 처럼 PascalCase되는 명명 규칙 일부 코드를 따르십시오 더보기 here

    1

    단순히이 코드 조각을 사용

    int i; 
    
    public int I 
    { 
        get { return i; } 
        set { if (value <= 60) i = value; } 
    } 
    

    코드의 문제는 당신이 순환 효과로 전환, 게터/세터의 체내 자체에 언급 된 속성에 내가 지정한 것입니다, 결국 StackOverflow 오류가 발생합니다.

    1
    int i { 
        get{ 
         return i; 
        } 
        set { 
         ... 
         i = value; 
         ... 
        } 
    } 
    

    위의 코드에서 get 및 set 블록 내에서 동일한 속성 이름을 사용하고 있습니다.

    은 컴파일 후, 코드는 여기에 어떤 것을 동등한로 변환됩니다

    int get_i() 
    { 
    return get_i(); 
    } 
    
    void set_i(int value) 
    { 
    set_i(value); 
    } 
    

    당신은 그들 각각이 StackOverflow 예외로 결과, 어떤 종료 조건없이 무한 자체 (재귀)를 호출합니다 알 수 있듯이 .

    이 질문에 대한 다른 답변이 제안하는 방법과 같은 재산에 백업 필드가있는 경우, 컴파일러는 더 재귀가 없습니다 이에 상응하는 어떤 것을 생성 할 것입니다 :

    int get_i() 
    { 
    return _i; //_i is the backing field 
    } 
    
    void set_i(int value) 
    { 
    _i = value; 
    } 
    

    UPDATE :

    완성을 위해 여기에 문제를 해결하는 방법을 추가하겠습니다.

    int _i; 
    int i { 
        get{ 
         return _i; 
        } 
        set { 
         if (value > 60) { 
         } else { 
          _i = value; 
         } 
        } 
    }