首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量c#可见性

变量c#可见性
EN

Stack Overflow用户
提问于 2017-07-21 08:52:52
回答 4查看 384关注 0票数 1

我取消了一些代码来比较两个目录,它们都工作得很好,但是为了我的目的,我想对它进行改进,这样我就可以根据稍微不同的需求回收代码了。原始代码列出了所有目录,但我想添加一个开关,这样我就可以决定是列出所有目录还是只列出顶级目录。下面是我的代码片段;

代码语言:javascript
复制
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语句之外可见呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-21 08:57:23

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

代码语言:javascript
复制
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());

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

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2017-07-21 08:56:10

它们无法访问,因为它们是在if/else的作用域中定义的。有关作用域中变量的可访问性的更多信息

您可以将它们定义在外部,如Mark的答案中所示,但是将if of更改为只处理哪个SearchOption。这样您就没有代码重复:

代码语言:javascript
复制
var option = allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;

IEnumerable<FileInfo> list1 = (new DirectoryInfo(pathA)).GetFiles("*.*", option);
IEnumerable<FileInfo> list2 = (new DirectoryInfo(pathB)).GetFiles("*.*", option);

bool areIdentical = list1.SequenceEqual(list2, new FileCompare());
票数 2
EN

Stack Overflow用户

发布于 2017-07-21 08:55:42

这很简单,在if语句之外声明它们,然后在内部分配:

代码语言:javascript
复制
public void DoCompare(string pathA, string pathB, bool allDirs)
{
    DirectoryInfo dir1 = new DirectoryInfo(pathA);
    DirectoryInfo dir2 = new DirectoryInfo(pathB);

    IEnumerable<FileInfo> list1; // declare list1 here
    IEnumerable<FileInfo> list2; // declare list2 here

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

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

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

它是不可访问的,因为它是在外部范围内不可见的内部范围中声明的。

还可以使用条件运算符?简化该方法。

代码语言:javascript
复制
IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45233284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档