并非所有代码路径都返回值(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"抱怨不是所有的代码路径返回一个值。我如何解决这个问题?谢谢!
如果列表文件为空会发生什么?
编译器到达函数的末尾,没有碰到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;
}