2009-10-29 7 views
1

왜 작동하지 않습니까? 정적 메서드 내에서 정적 변수를 만들 수 없습니까?

public static int[] GetListOfAllDaysForMonths() 
{ 
    static int[] MonthDays = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; 

    return MonthDays; 
} 

나는 방법의 외부 변수 선언을 이동했다 :이 방법을 만들어 있도록

static int[] MonthDays = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; 
public static int[] GetListOfAllDaysForMonths() 
{ 
    return MonthDays; 
} 

또한, 우리는 메모리에 주위에 떠있는이 배열의 하나 개의 인스턴스가? 이 메서드는 정적 클래스 안에 있습니다.

+0

이제 제 질문은 여기에 있습니다. 메소드에 정적 지역을 추가 할 수 없기 때문에 두 번째 예제에서 메모리 할당을 실제로 절약 할 수 있습니까? 방법? 메서드 외부에있는 지역 변수가 호출되어 메모리에 해당 int가 생성되는 시점은 언제입니까? 그리고이 클래스가 정적 클래스에 있고 그 클래스를 사용하여 예제 # 2의 메서드를 호출하는 경우에만 한 번 수행합니까? – PositiveGuy

+0

예, 할당을 저장합니다. 하지만 훨씬 더 중요한 최적화는 IEnumerable을 반환 할 것입니다. (Enumerable.Range (1,31)) –

답변

17

C#은 고정 로컬을 전혀 지원하지 않습니다. 정적 인 것은 유형 또는 유형 자체의 구성원이어야합니다 (즉, 정적 클래스).

Btw, VB.Net은 정적 지역을 지원하지만 컴파일 타임에 코드를 다시 작성하여 변수를 유형 수준으로 이동하고 기본 스레드 안전성을 위해 Monitor 클래스로 초기 할당을 잠급니다).

[후 동의 부록] 당신이 진짜 달에 넥타이를하지 않는
는 개인적으로, 코드 샘플은 나에게 의미가 보인다. 다음과 같이하면 좋을 것입니다 :

public static IEnumerable<DateTime> GetDaysInMonth(DateTime d) 
{ 
    d = new DateTime(d.Year, d.Month, 1); 
    return Enumerable.Range(0, DateTime.DaysInMonth(d.Year, d.Month)) 
      .Select(i => d.AddDays(i)); 
} 

또한 배열을 사용하고 있지 않습니다. Arrays should be avoided in .Net, 다른 이유 대신 배열을 사용하는 이유를 정말로 알지 못하는 경우.

+2

정적 로컬이란 무엇을 의미합니까? 나는 당신의 대답을 의심하지 않습니다, 그것은 단지 비관적 인 것처럼 보이기 때문에 저는 호기심이 생깁니다. – jprete

+0

@jprete : 일부 언어에서는 단일 메소드의 범위에 정적 변수를 정의 할 수 있습니다. 정적이지만 그 메소드의 범위에서만 사용할 수 있습니다. –

+0

+1 for the VB.NET 편집 : –

8

클래스/구조체 범위에서만 정적 변수를 만들 수 있습니다. 그것들은 정적입니다. 즉, 메서드가 아니라 형식에 정의되어 있습니다.

이것은 C#에서 "정적"이라는 용어를 사용하는 방식으로 다른 언어에서는 "정적"이 사용 된 방식과 다릅니다.

+0

와우, 이것이 가까웠다. 내 답변이 먼저 "가장 오래된"것으로 정렬되어 표시되지만 내 답변을 제출 한 후 첫 페이지보기가 이미 여기에 있었으므로 광산이 DB에 들어간 후 답변 목록이 검색되기 전에 두 번째로 분할되어야합니다. 세우다. –

+1

Hehehe. 그것이 경주 였음을 깨닫지 못했다;) –

+0

그것은 아니지만, 2500 년이 넘는 해답에서 나는 그 일이 전에는 보지 못했다. –

0

메서드 내에서 선언 된 정적 변수의 범위는 어떻게됩니까? CLR 메서드 정적 변수를 지원하지 않는다고 생각합니까?

0

글쎄, 지원되지 않는다는 점을 제외하고는 왜 원했습니까? 메소드 내에서 무언가를 정의해야한다면, 그 메소드는 로컬 범위를 가지며, 그 이상의 것을 필요로하지 않는다.

+0

많은 이유가 있습니다. 간단한 예제는 임의의 값을 반환하는 메서드입니다. prng로 작업 할 때 일반적으로 한동안 동일한 인스턴스를 유지하려고합니다. 형식의 private 네임 스페이스를 prng 개체의 필드로 오염시킴으로써이 작업을 수행 할 수 있지만 메서드에 연결된 정적 멤버가 더 이해할 수 있습니다 –

+0

내 상사가 변경을 요청하고 이렇게 말하면 우리는 우리가 그 숫자 목록을 얻을 필요가있을 때마다 할당을 만듭니다. – PositiveGuy

+0

이 코드를 사용하기 전에이 메서드는 int를 사용하여 foreach를 사용하고 1-31을 목록에 추가하여 일반 int 목록을 작성했습니다. 그는 그런 식으로 일을하면서, 매번 그 목록에 대한 새로운 인스턴스/할당을 만들고있었습니다. 그리고 그의 길을 (이렇게)함으로써 나는 그렇게하지 않습니다. – PositiveGuy