1

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

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

4

6 回答 6

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);
}
于 2013-04-23T08:12:14.617 回答
1

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

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

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

return false;
于 2013-04-23T08:12:23.160 回答
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();
于 2013-04-23T08:15:21.580 回答
0
bool userExists(string pcName)
{
    return Directory
        .GetFiles(usersFile)
        .Any(fileName => fileName == pcName);
}
于 2013-04-23T08:14:03.600 回答
0

问题是您的“文件”数组可能为空。如果是这种情况,您的布尔返回语句将永远不会被击中。放一个最后的'return false;' 在 for...each 循环之后,您将不会再收到任何错误。

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

于 2013-04-23T08:14:51.010 回答
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;
}

检查任何文件。

于 2013-04-23T08:43:19.143 回答