2010-04-18 5 views
1

난 그냥 LINQPad에서 일부 코드 놀고 있었고 stackoverflow 예외로 프로그램을 충돌 관리했습니다.public 인스턴스 속성에서 정적 속성의 값 반환

기본적으로 필드에 정적 속성을 만들고 속성을 사용하여 인스턴스의 값을 반환했습니다.

내 인스턴스 속성의 getter는 정적 필드의 값을 반환하지만 setter는 자체를 설정합니다. 이 유형의 패턴은 언제 사용되며 어떻게 stackoverflow 예외가 생성됩니까? 내가 무슨 짓을했는지의

코드 예제 :

void Main() 
{ 
    SomeClass myinstance = new SomeClass(); 
    SomeClass.x = "Some Value"; 
    myinstance.y = "Some other value"; 
    myinstance.y.Dump(); 
} 

public class SomeClass 
{ 
    public static string x; 

    public string y 
    { 
     get { return x; } 
     set { y = value; } 
    } 
} 

답변

4

이 내가 :) 속성했던 제일 먼저 - 당신이 반복적으로 Y 세터를 호출보다는 백업 필드를 설정하고 있습니다. 그것이 자신을 호출하기 때문에 결국에는 스택 오버 플로우가 발생합니다.

각 setter는 구문 설탕이며 기본적으로 메서드 호출입니다. 무슨 짓을했는지하는 방법으로이 일을 기본적으로 동일합니다 :

public class SomeClass 
{ 
    public string GetValue() { return "some string"; } 
    public void SetValue(string arg) 
    { 
     SetValue(arg); // recursively calls itself until stackoverflow 
    } 
} 
+0

예! 고마워. 신인 선수 란 무엇입니까? P –

+0

쉽게 할 수 있습니다. 많은 사람들이이 작업을 수행했는지 확신합니다. –

1

당신은 y = value; 대신 세터에서 x = value;를 썼다!

주, 그 간단한 속성이 자동으로 숨겨진 필드를 생성합니다

public string y { get; set; } 

를 사용할 수 있습니다.

+0

Danvil에게 감사드립니다. 정적이 아닌 속성에서 정적 필드의 값을 반환 할 때 일어나는 일을 테스트했기 때문에 자동 속성을 사용하지 않았습니다. :) –

+0

그래서 내 대답은 어떻게 든 잘못 지시되었습니다. :) – Danvil