c#foreach循环访问变量

时间:2016-01-20 11:59:04

标签: c# .net foreach unassigned-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";

它完美无缺。 如果你想知道

,这只是一个方法的剪辑

5 个答案:

答案 0 :(得分:3)

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

我建议使用

string fileDelete = null; // or ""

然后检查一下。

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

答案 1 :(得分:1)

它完全符合预期。

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

在声明并且仅在循环中的某些条件下分配fileDelete时,您并未向fileDelete分配任何值。

但是你在循环中试图在这个条件之外使用它的值,因此编译器无法推断 - fileDelete在运行时是否有某些值(如果条件下的代码不是执行 - 然后Widget&& var1 = Widget(); // rvalue reference auto&& var2 = var1; //var2 not rvalue reference 没有价值)。

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

答案 2 :(得分:0)

想象一下这种情况:

  • countFiles > 5为True
  • {li> infoFile someFile大于min

传递给fileDelete后,File.Delete会有什么价值?

答案:在这种情况下,fileDelete将被取消初始化,因此会显示错误消息。

答案 3 :(得分:0)

答案 4 :(得分: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);
        }   
    }

}