关于c#:如何解决未分配的’out’参数错误?


How to solve unassigned 'out' parameter error?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试计数给定路径的所有子文件夹中的文件总数。我正在使用递归函数调用。原因可能是什么?

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 { }
}


您需要一个ref参数而不是out参数,因为您既接受该值又设置了一个新值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int iCount = 0;
getFileCount(_dirPath, ref iCount);

private void getFileCount(string _path, ref 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, ref iCount);
    }
    catch { }
}

更好的是,根本不要使用out参数。

1
2
3
4
5
6
7
private int getFileCount(string _path) {
    int count = Directory.GetFiles(_path).Length;
    foreach (string subdir in Directory.GetDirectories(_path))
        count += getFileCount(subdir);

    return count;
}

甚至更好的是,不要创建一个函数来做框架已经内置的事情。

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

而且我们还没有变得更好…当您只需要一个长度时,不要浪费空间和周期来创建一个文件数组。把它们列举出来。

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


传递为out的参数需要在函数内初始化。由于ICount尚未初始化,但该值未知,并且它不以何处开始,即使它是一个默认值为0的整数。

我建议不要将out参数与递归函数耦合在一起。相反,可以使用常规的返回参数。微软本身通过一些静态分析规则来建议尽可能避免使用out参数。