1

我有以下问题:我有一个字符串变量,它必须存储一个文件路径。在 foreach 循环中,我遍历某个目录中的所有文件,并寻找最旧的文件,该文件保存在该字符串变量中。循环完成后,我尝试删除该文件,但出现错误:使用未分配的局部变量。

这是代码:

DateTime min = DateTime.Now;
string[] fileNames = Directory.GetFiles(somePath);
string fileDelete;
int countFiles = fileNames.Length;
if (countfiles > 5)
{
    foreach (string someFile in fileNames)
    {
        FileInfo infoFile = new FileInfo(someFile);
        if (infoFile.CreationTime <= min)
        {
            min = infoFile.CreationTime;
            fileDelete = someFile;
        }   
    }
    File.Delete(fileDelete);
}   

它说 File.Delete(fileDelete) 中的字符串 fileDelete 没有价值,但有趣的是,当我在开头给它一个值时,就像这样:

string fileDelete = "blabla";

它工作得很好。这只是方法的一个片段,以防您想知道

4

5 回答 5

3

在 C# 中,您必须初始化变量,否则您可能会将垃圾值传递给 File.Delete。

我建议使用

string fileDelete = null; // or ""

稍后检查。

if (!string.IsNullOrEmpty(fileDelete))
{
  File.Delete(fileDelete);
}
于 2016-01-20T12:03:47.603 回答
1

它完全按预期工作。

在 C# 中,局部变量不会在声明时自动初始化。

fileDelete在声明它并仅在循环中的某些条件下分配它时,您不会为它分配任何值。

但是你试图在循环中在这个条件之外使用它的值,因此编译器无法推断 -fileDelete在运行时是否会有一些值(如果条件下的代码不会被执行 - 那么fileDelete将没有价值)。

因此编译器会生成此错误。

于 2016-01-20T12:03:05.770 回答
0

想象一下这个场景:

  • countFiles > 5是真的
  • infoFile因为someFile大于min

fileDelete传递给 时会有什么值File.Delete

答:在这种情况下fileDelete将未初始化,因此会出现错误消息。

于 2016-01-20T12:02:37.493 回答
0

您必须初始化变量。请参阅 为什么编译错误“使用未分配的局部变量”?

于 2016-01-20T12:11:27.900 回答
0

用这个

DateTime min = DateTime.Now;
string[] fileNames = Directory.GetFiles(somePath);
string fileDelete;
int countFiles = fileNames.Length;
if (countfiles > 5)
{
    foreach (string someFile in fileNames)
    {
        FileInfo infoFile = new FileInfo(someFile);
        if (infoFile.CreationTime <= min)
        {
            min = infoFile.CreationTime;
            fileDelete = someFile;
            File.Delete(fileDelete);
        }   
    }

}   
于 2016-01-20T12:23:50.090 回答