2010-04-03 3 views
1

배열을 테스트 할 더미 클래스가 있습니다. 런타임에 배열의 크기를 동적으로 할당하려면이 크기를 나타내는 필드가 정적이어야합니다. 나는 아마 이런 종류의 코드를위한 콜렉션을 사용해야한다는 것을 알고 있지만, 나는 왜이 필드들이 정적이어야하는지 더 관심이있다? 이것의 뒤에 어떤 특별한 이유가 있습니까?동적으로 할당되는 배열의 크기가 정적 필드 여야하는 이유는 무엇입니까?

class Foo 
{ 
    private static int x; 
    private static int y; 

    private int[,] bar = new int[ x, y ]; 

    public Foo(int a, int b) 
    { 
     x = a; 
     y = b; 
    } 
} 

답변

5

정적 일 필요는 없습니다. 인스턴스 변수 초기화 프로그램 내에서 다른 인스턴스 변수를 참조 할 수 없습니다. 즉, 좀이처럼 다음 C# 3 사양의 섹션 10.5.5.2에서

class Foo 
{ 
    private int x; 
    private int y = x; // Invalid 
} 

는 : 인스턴스 필드

변수 초기화 인스턴스 가 작성되는 참조 할 수있다. 따라서 변수 이니셜 라이저가 단순 이름을 통해 이니셜 라이저를 참조 할 때 컴파일 타임 오류가 발생하므로 컴파일 타임 오류가 있으므로 변수 초기화 프로그램에서이 코드를 을 참조해야합니다.

난 당신이 정말 이런 걸 원하는 의심 : 물론

class Foo 
{ 
    private int x; 
    private int y; 

    private int[,] bar; 

    public Foo(int a, int b) 
    { 
     x = a; 
     y = b; 
     bar = new int[x, y]; 
    } 
} 

당신이 정말로 전혀 xy 필요하지 않습니다를 - 그들은 배열의 각 차원을 유지하는 것이 편리 할 것. bar.GetLength(0)bar.GetLength(1)을 사용하여 두 가지 길이를 얻을 수 있지만 그다지 즐겁지는 않습니다.

당신은 비록 widthheightxy 이름을 바꾸려면, 또는 비슷한 수 :

1

바 아무것도하지만,에게 크기 [0의 배열 '배열이 없을 것 푸'의 표시 예 , 0] : 인스턴스 생성은 클래스 생성자를 호출하기 전에 발생합니다.

public class Foo2 
{ 
    private int[,] bar; 

    public Foo2(int a, int b) 
    { 
     bar = new int[a,b]; 
    } 
} 

하면 크기가 [A, B] 정적 '를 사용하지 않고 배열을 줄 것이다 :

이것이보십시오.

+0

헨크의 답변에 대한 J. Skeet의 초기 의견은 원래 클래스 'Foo에 관한 위의 첫 문장에도 적용됩니다. – BillW

관련 문제