c#变量的可见性

标签 c# scope

我提取了一些代码来比较两个目录,一切正常,但我想根据我的目的对其进行改进,以便我可以针对略有不同的要求回收代码。原始代码列出了所有目录,但我想添加一个开关,以便我可以决定是列出所有目录还是仅列出顶层目录。这是我的代码片段;

public void DoCompare(string pathA, string pathB, bool allDirs)
{
    DirectoryInfo dir1 = new DirectoryInfo(pathA);
    DirectoryInfo dir2 = new DirectoryInfo(pathB);

    if (allDirs)
    {
        IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", SearchOption.AllDirectories);
        IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", SearchOption.AllDirectories);
    }
    else
    {
        IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
        IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", SearchOption.TopDirectoryOnly);
    }

    //A custom file comparer defined later
    FileCompare myFileCompare = new FileCompare();

    bool areIdentical = list1.SequenceEqual(list2, myFileCompare);

现在没有 if (allDirs) 这工作正常。当我把它放进去时,list1 和 list 2 在最后一行代码中不可见。实际错误是“名称 list1 在当前上下文中不存在”。我尝试在 if 之外声明它们,但这依赖于它们返回结果,如果没有决定,这是不可能的。那么如何让这些在 if 语句之外可见呢?

最佳答案

它是不可访问的,因为它是在一个在外部范围内不可见的内部范围内声明的。但是您只想根据 bool 更改 SeachOption,那么为什么不简单地:

SearchOption opt = allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", opt);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*.*", opt);
bool areIdentical = list1.SequenceEqual(list2, new FileCompare());

如果你不能这样做,你必须在外面声明它:

IEnumerable<FileInfo> list1;
IEnumerable<FileInfo> list2;
if(allDirs)
{
    list1 = ...
    list2 = ...
}
else
{
   list1 = ...
   list2 = ...
}
// now you can access them here because they are declared in the same scope

关于c#变量的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233284/

相关文章:

c# - UWP 写入 CSV 文件

c - 返回局部变量行为的地址

C# - 在不知道它会是什么的情况下初始化一个变量

c++ - 在使用 GLUT 时避免使用全局变量

javascript - 第一次执行代码时将永久值存储在变量中,JavaScript

c# - 无法将类型为 'System.String' 的对象转换为类型 'System.Byte[]' 错误 MYSQL NET CORE 3.1

c# - 如何在以编程方式与控件交互后防止事件触发?

c# - 如何在另一个应用程序域中设置静态 bool 值?

javascript - Firefox 中的 JavaScript 作用域问题

php - 从 error_handler 访问变量