并非所有代码路径都返回值(bool)

本文关键字:返回值 bool 路径 代码 | 更新日期: 2023-09-27 18:10:31

我正在为体验创建一个消息传递服务应用程序。然而,我偶然发现了一个我以前遇到过的错误。下面是我的方法:

bool userExists(string pcName)
    {
        string[] files = Directory.GetFiles(usersFile);
        foreach (string fileName in files)
        {
            if (fileName == pcName)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

可以看到,如果用户的txt文件存在于文件夹中,该方法将返回是或否的答案。对我来说,所有的代码路径都返回一个值。这是有道理的,显然编译器不认为相同,因为我得到一个错误的"bool userExists"抱怨不是所有的代码路径返回一个值。我如何解决这个问题?谢谢!

并非所有代码路径都返回值(bool)

如果列表文件为空会发生什么?
编译器到达函数的末尾,没有碰到return语句,这就是它告诉你的。

写代码的好方法是:

bool userExists(string pcName)
{
    string[] files = Directory.GetFiles(usersFile);
    foreach (string fileName in files)
    {
        if (fileName == pcName)
        {
            return true;
        }
    }
    return false;
}

现在是熟悉Linq:

的时候了
bool userExists(string pcName)
{
    return Directory.GetFiles(usersFile)
                    .Any(file => file == pcName);
}

如果您的files没有文件怎么办?

你的代码将跳过foreach语句,但它不会返回任何东西,因为在你的foreach语句中,你没有任何return语句。

string[] files = Directory.GetFiles(usersFile);
foreach (string fileName in files)
{
    if (fileName == pcName)
    {
        return true;
    }
}
return false or true;

或者有其他Linq方法解决;

return Directory.GetFiles(usersFile)
                .Where(fileName => fileName == pcName)
                .Any();

如果files是空的呢?所以你可以这样做:

string[] files = Directory.GetFiles(usersFile);
foreach (string fileName in files)
{
    if (fileName == pcName)
    {
        return true;
    }
}
return false;
bool userExists(string pcName)
{
    return Directory
        .GetFiles(usersFile)
        .Any(fileName => fileName == pcName);
}

问题是你的'files'数组可能是空的。如果是这种情况,那么布尔返回语句将永远不会被命中。在for…后面加上最后一个'return false;'每个循环,你不会得到任何更多的错误。

话虽如此,你的基本逻辑是有缺陷的。通过在else语句中返回false,循环将永远不会继续(假设有多个文件)。

首先,为什么使用GetFiles ?用EnumerateFiles代替。

bool UserExists(string pcName)
{
    return Directory.EnumerateFiles(this.usersFile).FirstOrDefault(f => f == pcName);
}

这段代码实现了与你的代码相同的功能。

但是,您可能实际上想要

bool UserExists(string pcName)
{
    return Directory.EnumerateFiles(this.usersFile).Any(f => f == pcName);
}

枚举将立即开始,而不需要创建中间数组。如果早期找到匹配,就可以避免不必要的处理和从磁盘读取。


您可以通过执行

来避免出现"并非所有代码路径都返回值"的消息
bool userExists(string pcName)
{
    string[] files = Directory.GetFiles(usersFile);
    return files.Length > 0 && files[0] == pcName;
}

如果您只想检查第一个文件。这将处理files为空的情况。虽然,我怀疑你真的想要

bool userExists(string pcName)
{
    string[] files = Directory.GetFiles(usersFile);
    foreach (string fileName in files)
    {
        if (fileName == pcName)
        {
            return true;
        }            
    }
    return false;
}