Utworzenie tablicy statycznej

0

Chcę utworzyć tablicę statyczną, której rozmiar określa zmienna statyczne.

Mam coś takiego:

 
static class ZmienneGlobalne
    {
        static ZmienneGlobalne()
        {
        }
        public static int a;
        public static int[,] tab = new int[a + 1, a + 1];
    }

Co prawda błędów nie ma, lecz tablica "tab" nie jest utworzona poprawnie. Nie zgadzają się indeksy, tak jakby zmienna "a" była równa 0. Zanim cokolwiek jest wpisywane do tablicy "tab", zmienna "a" posiada konkretną wartość.
W przypadku wpisania stałych wartości do rozmiaru tablicy wszystko jest ok, lecz nie o to chodzi. Nie wiem co z tym zrobić. Jakieś sugestie?

0

Myślę, że pola statyczne są inicjowane w momencie ładowania klasy (tzn tak jest chyba w JVM).

Możesz zrobić np pole tab prywatne i metodę:

public static int[,] getTab() {
if (tab == null) {
tab = new int[a + 1, a + 1];
}
return tab;
}

Najlepszym rozwiązaniem jest jednak pozbycie się zmiennych globalnych (statycznych) w ogóle.

0

Wartości statyczne z zasady powinny być zainicjowane jakimiś wartościami, więc tworzenie statycznej zmiennej i nie zainicjowanie jej jest moim zdaniem bez sensu. Kompilator nie wyrzucił Ci błędu ale ostrzeżenie powinien wyrzucić. Jeżeli nie zainicjusze wartości to domyślnie jest ustawiana wartość 0 (tak jest przynajmniej w Visual Studio 2005).

0

Poradziłem sobie z tym problemem używając list. Muszę przyznać, że lepiej się na nich pracuje.

1

Myślę, że pola statyczne są inicjowane w momencie ładowania klasy

Zależy co rozumiesz przez "ładowanie". Jeśli samo odpalenie programu - to nie. Konstruktor statyczny się wykonuje w przypadku pierwszego **użycia **klasy (np. obiektu, lub jakiejkolwiek części statycznej klasy).

Wartości statyczne z zasady powinny być zainicjowane jakimiś wartościami, więc tworzenie statycznej zmiennej i nie zainicjowanie jej jest moim zdaniem bez sensu.

Czyżby? Wiele definicji klasy z samej biblioteki .NET posiada pola statyczne nie inicjowane, albo inicjowane z obiektów tej klasy (jedynym celem jest w drugim przypadku performance, jednak chciałem pokazać, że to co piszesz jest nieprawdą).

Jeżeli nie zainicjusze wartości to domyślnie jest ustawiana wartość 0 (tak jest przynajmniej w Visual Studio 2005).

Tylko w przypadku pól, które są liczbami (int, float, byte itd). W każdym innym przypadku jest to inna wartość domyślna (np. dla typów referencyjnych - null).

A poza tym - co ma Visual Studio 2005 do C#?

1 użytkowników online, w tym zalogowanych: 0, gości: 1