문제

.NET 3.5에서 일하고 있습니다. 스택에서 첫 번째 항목을 제거하고 다음 항목을 검색하는 스택과 getter 속성이있는 클래스 "A"가 있습니다.

클래스를 초기화 한 후, 나는 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(); 
            };
        }            
    }
도움이 되었습니까?

해결책

첫째, 부동산 접근자를 변경하게하는 상태는 일반적으로 나쁜 생각입니다. 가장해야 할 일은 무언가를 게으르게 초기화하는 것입니다. DateTime.Now 하다).

둘째, 디버거 아래에서 실행중인 경우이를보고있을 것입니다. 코드를 밟는 동안 속성에 액세스 할 수 있습니다. 그것은 아마도 브레이크 포인트가 왜 맞지 않았는지 설명 할 것입니다.

다른 팁

Urls.Pop();

되고 싶어

return Urls.Pop();

값을 반환 할 때 그리고 목록에서 동시에 제거합니다


실제로 귀하의 질문을 다시 읽은 것은 디버거가 속성을 평가하기 때문인 것 같습니다. 디버거없이 응용 프로그램을 실행하면 같은 문제가 발생합니까?

이것은 내가 생각하는 나쁜 디자인입니다. Get Accessor는 후속 통화에서 다른 결과를 일으키는 방식으로 객체를 돌연변이해서는 안됩니다.

IMO, 여기서 문제는 불쾌한 부작용이있는 속성을 가지고 있다는 것입니다. 이것은 방법이어야합니다.

    public string GetNextUrl() { /* */ }

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

속성에서 부작용을 합리적으로 사용하는 것은 게으른로드, 지연 초기화 등과 같은 것들입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top