2010-01-12 4 views
3

.net 3.5에서 작업하고 있습니다. 나는 스택과 getter 속성을 가진 클래스 "A"를 가지고 있는데,이 속성은 호출 될 때 스택의 첫 번째 항목을 제거하고 다음 항목을 가져온다.Getter 속성은 아무도 호출하지 않고 실행됩니다.

클래스를 초기화 한 후에 getter가 호출되지 않고 작동하고 스택의 최상위 항목을 제거하여 나쁜 결과를 얻는 것을 보았습니다. getter의 중단 점은 아무도 통과하지 못함을 나타냅니다.

속성을 속성으로 변경하면 스택이 반환됩니다.

왜 누군가가 설명 할 수 있다면 행복 할 것입니다. 여기

는 단순화 된 클래스입니다 :

public class A 
    { 
     private Stack<string> Urls; 

     public A(string title, string[] array) 
     { 
      Urls = new Stack<string>(); 
      foreach (string s in array) 
      { 
       Urls.Push(s); 
      } 
     } 

     public string Url 
     { 
      get { return Urls.Peek(); } 
     } 
     public string NextUrl 
     { 
      get{ 
      if (Urls.Count > 1) 
       { Urls.Pop(); } 
      return Urls.Peek(); 
      }; 
     }    
    } 

답변

9

먼저 속성 접근자를 변경하면 상태가 변경되는 것이 일반적으로 바람직하지 않습니다. 지연해야 할 일은 느리게 초기화하는 것입니다 (또는 DateTime.Now처럼).

둘째, 디버거에서 실행중인 경우이 코드가 표시됩니다. 코드를 단계별로 실행하면서 속성에 액세스합니다. 아마도 브레이크 포인트가 맞지 않는 이유를 설명 할 것입니다.

+0

감사합니다. 나는 영광이다. :) – Nir

2
Urls.Pop(); 

가 동시에 목록에서 제거 값을 반환로

return Urls.Pop(); 

을되고 싶어


실제로 질문을 다시 읽으면 디버거가 속성을 평가하기 때문에 문제가없는 것처럼 보입니다. 디버거없이 응용 프로그램을 실행하면 동일한 문제가 발생합니까?

+0

네, 다시 읽으십시오. 아마도 맞을 것입니다. 내 대답과 표제를 "훈련 된"배지로 삭제했습니다 :-) +1 – balpha

+0

디버거 외부에서 시도하지 않았지만 거의 100 % 확신합니다. 감사. – Nir

1

이것은 내가 생각하기에 좋지 않은 디자인입니다. get 접근자는 후속 호출에서 다른 결과를 초래하는 방식으로 객체를 변형해서는 안됩니다.

+0

감사합니다. 이제 나는 그것을 안다. :) – Nir

1

IMO, 여기서의 문제는 명백하지 않은 부작용이있는 속성입니다. 이 방법이 있어야합니다 :

public string GetNextUrl() { /* */ } 

그렇지 않으면 나쁜 일이 발생합니다 (디버거, 데이터 바인딩 등). 누군가가 단지 한 번 부동산을 읽는다 고 가정하지 마십시오.

속성에서 부작용을 감지하는 유일한 방법은 지연로드, 지연 초기화 등과 같은 것들입니다. 다른 명백한 변경 전화없이 순차적으로 호출 할 때도 동일한 값을보고해야합니다.

+0

고마워, 마크. 감사합니다. – Nir

관련 문제