并非所有代码路径都返回一个值(bools)

时间:2013-04-23 08:11:08

标签: c# boolean

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

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”上收到错误,抱怨并非所有代码路径都返回一个值。我该如何解决这个问题? 谢谢!

6 个答案:

答案 0 :(得分:2)

例如,如果列表文件为空,会发生什么? 编译器到达函数的末尾而没有点击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);
}

答案 1 :(得分:1)

如果files为空,该怎么办?所以你可以这样做:

string[] files = Directory.GetFiles(usersFile);

foreach (string fileName in files)
{
    if (fileName == pcName)
    {
        return true;
    }
}

return false;

答案 2 :(得分:1)

如果您的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();

答案 3 :(得分:0)

bool userExists(string pcName)
{
    return Directory
        .GetFiles(usersFile)
        .Any(fileName => fileName == pcName);
}

答案 4 :(得分:0)

问题是你的“文件”数组可能是空的。如果是这种情况,那么你永远不会遇到布尔返回语句。最终'返回假;'在for ...每个循环之后,你不会再有任何错误。

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

答案 5 :(得分:0)

首先,为什么要使用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;
}

检查是否有任何文件。