Zasięgi zmiennych w C#

Zasięgi zmiennych w C#

Wątek przeniesiony 2017-02-06 23:50 z C# i .NET przez somekind.

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 430
0

Cześć!
Mógłby mi ktoś wytłumaczyć jak działają zasięgi w C#?

Kopiuj
int i = 0;
String[] results;
while(result.Read()) 
{
   results[i] = result["name"].ToString();
   i++;
}
return results;

Visual studio do zmiennej i się nie pluje, natomiast ma problem ze zmienną results (która jest zadeklarowana zaraz przed pętlą). Mógłby mi ktoś wytłumaczyć dlaczego?

Aventus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UK
  • Postów: 2235
0

Bzdurę palnąłem. @some_ONE ma rację, a problemem jest to że nie zainicjowałeś zmiennej typu string[].

SO
  • Rejestracja: dni
  • Ostatnio: dni
0

A jaki masz błąd?
Bo raczej nie jest to problem z zasięgiem zmiennych.

  • Rejestracja: dni
  • Ostatnio: dni
1

A jaki jest ten problem, ktory ma VS? Strzelam, ze NullReferenceException bo twoje results jest nullem (deklarujesz je ale nigdzie nie inicjalizujesz).

NO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 430
0

Tak, zapomniałem wrzucić błędu, oto on:

Użyto nieprzypisanej zmiennej lokalnej „results”

result nie jest nullem ponieważ to nie jest cała metoda :)

Btw jak zadeklarować taką tablicę:
array[int][string] = string?

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 117
0
NickOver napisał(a):

Użyto nieprzypisanej zmiennej lokalnej „results”

Czyli wszystko jasne :)

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 117
2

Brakuje Ci inicjalizacji, czyli tego:

Kopiuj
 String[] results = new string[] { };
  • Rejestracja: dni
  • Ostatnio: dni
0

Odpowiadający są chyba sami początkującymi. Taka dyskusja pod prostym pytaniem! I jak można niby użyć później tablicy o rozmiarze zero?

Aventus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UK
  • Postów: 2235
1

Tablice inicjalizujesz podając jej wielkość, np.

Kopiuj
 int[] numbers = new int[3];

Nie wiem dokładnie jakiego typu jest zmienna result ale strzelam że IDataReader więc na etapie iteracji nie wiesz ile wyników będzie zwróconych. Zamiast używać tablicy lepiej użyj List<string>.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
return Enumerable.Range(0, int.MaxValue)
    .Select(x => result)
    .TakeWhile(r => r.Read())
    .Select(r => r["name"].ToString())
    .Reverse()
    .ToArray();

;-)

A tak serio - jeśli nie wiesz, ile jest elementów, to nie możesz użyć tablicy. Tablice mają stały rozmiar, który musi być znany w momencie tworzenia takiej tablicy. Ty tworzysz pustą tablicę (zero elementów), a potem odwołujesz się do nieistniejących elementów. Kompilator czasem jest to w stanie wykryć i tak właśnie jest teraz.
Zamiast tablicy użyj listy stringów i metody Add().

SK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 117
0
Nadziany Lew napisał(a):

Odpowiadający są chyba sami początkującymi. Taka dyskusja pod prostym pytaniem! I jak można niby użyć później tablicy o rozmiarze zero?

W moim przykładzie pokazałem mu tylko co to jest inicjalizacja.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.