2014-07-15 15 views
6

Próbuję zliczyć całkowitą liczbę plików we wszystkich podkatalogach danej ścieżki. Używam rekurencyjnego wywołania funkcji. Jaki mógł być powód?Jak rozwiązać nieprzypisany błąd parametru "out"?

Kod:

int iCount =0; 
getFileCount(_dirPath, out iCount); 

private void getFileCount(string _path, out int iCount) 
{   
    try 
    { 
     // gives error :Use of unassigned out parameter 'iCount' RED Underline 
     iCount += Directory.GetFiles(_path).Length; 

     foreach (string _dirPath in Directory.GetDirectories(_path)) 
      getFileCount(_dirPath, out iCount); 
    } 
    catch { } 
} 
+0

zadeklarowałeś iCount w głównym/globalnym? –

+1

Dlaczego nie można wprowadzić wartości zwracanej przez metodę zamiast jej przekazywać? Co masz na myśli? Co więcej, musisz ustawić zero na górze rekursji (np. Z 0). –

+0

zaktualizowany, zapomniałem, aby napisać pytanie, mam przypisać zero do zliczenia zmiennej –

Odpowiedz

11

chcesz parametru ref nie parametr out ponieważ jesteś zarówno akceptując wartość i ustawienie nowej wartości.

jeszcze lepiej, nie używaj parametrów w ogóle.

private int getFileCount(string _path) { 
    int count = Directory.GetFiles(_path).Length; 
    foreach (string subdir in Directory.GetDirectories(_path)) 
     count += getFileCount(subdir); 

    return count; 
}  

a nawet lepiej niż, że nie utworzyć funkcję do zrobienia czegoś ramy już jest zbudowany ..

int count = Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length 

i nie skończysz coraz lepiej ... don” t marnuje przestrzeń i cykle, tworząc szereg plików, gdy potrzebna jest tylko długość. Zamiast tego je wylicz.

int count = Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).Count(); 
+0

Dziękuję za odpowiedź, próbowałem funkcji Ref, ale daje mi błąd w wywołaniu funkcji, również nie muszę używać żadnej wbudowanej funkcji .. –

+0

Po zmianie funkcji na 'ref', także trzeba zmienić wywołanie na 'ref' i trzeba zainicjować zmienną przed wywołaniem. –

+0

mówi "Metoda musi mieć typ powrotu" w getFileCount (_dirPath, ref iCount); –

0

Parametry, które są przekazywane jako wyjściowe, muszą zostać zainicjowane w ramach funkcji. Ponieważ iCount nie jest jeszcze zainicjalizowany, wartość ta nie jest znana i nie ma gdzie zacząć, nawet jeśli jest liczbą całkowitą, której domyślne wartości to 0.

Nie polecam parowania parametru out razem z funkcją rekursywną. Zamiast tego możliwe byłoby użycie zwykłego parametru powrotu. Microsoft sugeruje za pomocą niektórych reguł analizy statycznej to avoid out parameters if possible.

Powiązane problemy