2010-04-30 2 views
5

VB6에는 프로 시저가 끝난 후 값을 유지하는 로컬 정적 변수가 있습니다. 공용 vars를 사용하는 것과 같지만 로컬 블록을 사용합니다. 예를 들어 :VB6의 C#에서 정적 인 정적?

sub count() 
static x as integer 
x = x + 1 
end sub 

전화 (10) 후, x는 10이 될 것이다 나는 .NET (심지어 자바)에서 같은 일을 검색 할 시도했지만 아무도 없었다. 왜? 그것은 어떤 식 으로든 OOP 모델을 깨뜨릴 수 있으며 그것을 에뮬레이션 할 수있는 방법입니다. 요청에 따라

private static int x; 
public [static] void Foo() { 
    x++; 
} 

폐쇄 예 :

using System; 
class Program { 
    private static readonly Action incrementCount; 
    private static readonly Func<int> getCount; 
    static Program() { 
     int x = 0; 
     incrementCount =() => x++; 
     getCount =() => x; 
    } 
    public void Foo() { 
     incrementCount(); 
     incrementCount(); 
     Console.WriteLine(getCount()); 
    } 
    static void Main() { 
     // show it working from an instance 
     new Program().Foo(); 
    } 
} 

답변

6

당신이 얻을 수있는 가장 가까운 이외의 방법 정적 필드 입니다 그 목적을 위해 :

class C 
{ 
    static int x=0; 

    void count() 
    { 
    ++x; // this x gets incremented as you want 
    } 
} 
+2

정적 생성자를 사용하여 클로저를 사용하여 델리게이트 필드를 초기화하면 정적 필드와 달리 변수에 대한 액세스가 약간 더 가까워집니다 (클래스에서 리플렉션 또는 다른 클래스 메서드에서 볼 수 없음) –

+0

@Ben - 재미있는 접근 방식이지만 추가 복잡성이 많습니다. 사람들이 캡처 된 변수를 이해하도록하는 것이 가장 좋은 방법입니다. -p –

+1

그래, 알 겠어. 왜? * 왜? 그것은 어떤면에서 OOP를 깨뜨릴 수 있습니까? – blez

0

당신은 항상 클래스의 정적 변수를 사용할 수 있습니다

0

저는 Visual Basic에서 정적 개인을 기억합니다. 그들은 특정 작업을 위해 멋졌습니다.

.net에 그런 항목이 없습니다. 당신은 metod 바깥의 정적을 고수해야 할 것입니다.

+1

VB6에는 멋진 것들이있었습니다. – blez

+2

글쎄, 그들은 VB.NET (비록 C#이 아님)에서 사용할 수 있습니다 ... 당신이 메서드 내에서 정적 정수 (Integer)를 선언하면 VB6에서와 같이 동작합니다. –

0

종종 이러한 종류의 변수는 반복기를 유지하는 데 사용됩니다. C#은 yield 키워드를 통해 언어에 직접 내장되어 있습니다. 다음 예가 있습니다 :

이 예제에서 n은 호출자가 지정한 n 시간 테이블에 값을 생성합니다. 우리는 이러한 foreach 루프로, 반복자를 사용하는 어느 곳이를 사용할 수 있습니다

foreach (var value in TimesTable(3)) 
{ 
    Console.Write(""+ value + " "); 
} 

... 생산되는 :

C에서
3 6 9 12 15 18 21 24 27 30 33 36 

는 ++,이 것과 같은 정적 변수를 사용했을 수도 당신 반복자는 귀를 취소 할 수 있습니다 becuase 해당 ++

int TimesTable(int table) { 
    static i = 1; 
    if (i == 12) { 
     i = 1; 
    } 
    return i++ * table; 
} 

는 C# 버전이 C보다 낫다 (또는 VB) : (나는 VB 구문을 모르는, 그래서 나는 VB 사람이 아니에요) VB에서 설명 그리고 주어진 시간에 여러 개의 반복자가 활성화 될 수 있습니다. 이러한 것들은 개발자가 더 많은 작업을하지 않으면 C++ 버전에 해당하지 않습니다. 단점은 정적 변수와 같은 것이 C#에서 유효한 유일한 경우는 반복자 구현 중에이며 그 값은 그 범위를 벗어나 지속되지 않는다는 것을 의미합니다.

나는 당신에게 유용 할 것입니다.

+0

예, 반복기를 알고 있습니다 만, 그것이 필요한 특정 것이 아닙니다. 어쨌든, 감사합니다. – blez

관련 문제