C# 变量不';不存在于当前环境中

C# 变量不';不存在于当前环境中,c#,C#,但是,当我编译它时,我得到一个错误:名称“FS”在当前上下文中不存在 所以我在try..catch块前面放了一个FileStream声明,如下所示 I have the following code: try { FileStream FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read); return "";

但是,当我编译它时,我得到一个错误:名称“FS”在当前上下文中不存在

所以我在try..catch块前面放了一个FileStream声明,如下所示

     I have the following code:


        try
        {
            FileStream FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read);
            return "";
        }
        catch (FileNotFoundException ex)
        {
            return ex.Message;
        }

        finally
        {
            FS.Close();
            FS.Dispose();
        }
但是当我编译时,我得到一个错误,说使用未赋值变量FS,它指向finally块

现在我了解了这两个错误以及为什么会出现这些错误,但我不知道如何编写代码,这样我就可以尝试编写代码并捕获任何错误


任何帮助都将不胜感激-谢谢

如果抛出FileNotFoundException,会发生什么?然后您将看到finally子句(FS.Close()和FS.Dispose()),但是FS没有初始化!您应该做的是将FS初始化为null,并在finally子句中添加if语句来检查FS是否为null

        FileStream FS;
        try
        {
            FileStream FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read);
            return "";
        }
        catch (FileNotFoundException ex)
        {
            return ex.Message;
        }

        finally
        {
            FS.Close();
            FS.Dispose();
        }

FS是在try块的作用域中声明的,因此它不存在于该块之外

正确的代码是:

    FileStream FS = null;
    try
    {
        FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read);
        return "";
    }
    catch (FileNotFoundException ex)
    {
        return ex.Message;
    }

    finally
    {
        if (FS != null) {
            FS.Close();
            FS.Dispose();
        }
    }

此代码不是最优的(有关最优解决方案,请参阅Marc的答案)。这段代码仅仅是一个例子,说明了为什么原始代码没有编译(没有改变原始代码的结构)

其他的回答已经涵盖了为什么(范围和明确的任务),但是你让生活变得艰难

    FileStream FS = null;
    try
    {
        FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read);
        return "";
    }
    catch (FileNotFoundException ex)
    {
        return ex.Message;
    }

    finally
    {
        if (FS != null)
        {
          FS.Close();
          FS.Dispose();
        }
    }

这是不可编译的,这一事实甚至在原始帖子中也提到过。这段代码与问题中的代码不同。它确实没有编译,但原因不同:因为FS对象没有初始化为null。我会修正密码,但马克的答案是唯一正确的。
try {
    using(FileStream FS = new FileStream(
        this.InFile, FileMode.Open, FileAccess.Read))
    {
        return "";
    }
} catch (FileNotFoundException ex) {
    return ex.Message;
}