c#foreach循环访问变量

c# foreach loop access variable

我遇到以下问题: 我有一个字符串变量,它必须存储一个文件路径。 在 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";

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

想象一下这个场景:

  • countFiles > 5 为真
  • infoFile 对于 someFile 大于 min

传递给 File.DeletefileDelete 会有什么值?

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

它完全符合预期。

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

您在声明 fileDelete 时并没有为它赋值,并且仅在循环中的某些条件下赋值。

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

因此编译器会产生这个错误。

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

我推荐使用

string fileDelete = null; // or ""

稍后检查。

if (!string.IsNullOrEmpty(fileDelete))
{
  File.Delete(fileDelete);
}

您必须初始化您的变量。 见 Why compile error "Use of unassigned local variable"?

使用这个

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);
        }   
    }

}