2011-05-13 2 views
26

난 그냥 약간의 실험을했다 :C#을 정적 변수 범위와 지속성

public abstract class MyClass 
{ 
    private static int myInt = 0; 

    public static int Foo() 
    { 
    return myInt; 
    } 

    public static int Foo(int n) 
    { 
    myInt = n; 
    return bar(); 
    } 

    private static int bar() 
    { 
    return myInt; 
    } 
} 

을 한 후 나는 달렸다 :

MessageBox.Show(MyClass.Foo().ToString()); 
MessageBox.Show(MyClass.Foo(3).ToString()); 
MessageBox.Show(MyClass.Foo().ToString()); 
MessageBox.Show(MyClass.Foo(10).ToString()); 
MessageBox.Show(MyClass.Foo().ToString()); 

결과는 I, 0 10, 0, 3, 0이었다 예상 .

놀랍게도, I는 0, 3, 3, 10,

(10)는 이러한 변화가 얼마나 오래 지속 할있어? 프로그램 실행 기간? 정적 메서드를 호출하는 함수의 지속 시간은?

답변

39

지속 시간은 AppDomain입니다. 정적 변수에 대한 변경 사항은 여러 메소드에서 볼 수 있습니다.

MSDN : 지역 변수가 정적 키워드로 선언 된 경우

는 수명이 오래가 선언 된 프로 시저의 실행 시간보다. 프로 시저가 모듈 안에 있으면 응용 프로그램이 계속 실행되는 동안 정적 변수가 유지됩니다.

자세한 내용은 다음을 참조하십시오

+5

정적 변수는 클래스의 모든 인스턴스에서 공유합니다. 메서드에서 볼 수있는 것은 아닙니다. –

5

을이 정적 변수의 경우, 즉이 프로그램의 기간 동안 메모리에 정확히 한 곳에 존재 의미 .

2

프로그램 실행 기간 동안.

정적 클래스 변수는 전역 변수와 같습니다. 클래스의 특정 객체에 연결되지는 않습니다. 프로그램 당 하나의 인스턴스 만 있습니다. 함수 실행 시간 동안 살아있는 유일한 변수는 함수의 자동 (로컬) 변수입니다. 내가 기대

26

결과는 내가 0, 3, 3, 10, 난 (10)

있어, 0, 3, 0, 10, 놀랍게도 0

했다 왜 정적 변수가 Foo (int) 메소드 내에서 변경된 후에 원래 값으로 되돌아 갈 것으로 기대하는지 확신 할 수 없습니다. 정적 변수는 프로세스의 수명 내내 그 값을 유지하며, 인스턴스가 아닌 클래스 당 하나만 존재합니다.

+1

+1 클래스 변수와 인스턴스 변수를 구별합니다. –

+0

나는'myInt = 0' 부분이 두 번 이상 평가 될 것이라고 가정하고 있다고 생각합니다. –

+0

@Chris - he? 확실합니까? ;) – YetAnotherUser

1

프로그램 실행 기간 동안 또는 다른 값으로 덮어 쓸 때까지 지속됩니다. 원하는 결과를 만들고 싶다면 return myInt; 앞에 myInt = 0을 지정해야합니다.

3

C# 사양에 따라 정적 변수는 클래스가 AppDomain에 처음로드 될 때까지 초기화되며 해당 AppDomain이 언로드 될 때까지 (일반적으로 프로그램이 종료 될 때까지) 존재합니다.정적 범위

0

정적 변수가되지는 인스턴스에 입력 속한 앱이만큼 살 것이다. 그리고 대개 (여러 개의 앱 도메인을 만들지 않는 경우) 유형 객체는 프로세스의 수명 동안 한 번만로드되고 존재합니다.