繁体   English   中英

C#变量的可见性

[英]c# visibility of variable

我举起了一些代码来比较两个目录,它们都可以正常工作,但是我想针对我的目的对其进行改进,以便我可以针对稍有不同的需求回收代码。 原始代码列出了所有目录,但是我想添加一个开关,以便可以决定是列出所有目录还是仅列出顶层目录。 这是我的代码片段;

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

由于它们是在if/else范围内定义的,因此无法访问。 有关范围中变量的可访问性的更多信息

您可以在Mark的答案中在外部定义它们,但改为更改if,仅照顾哪个SearchOption 这样,您就无需重新编写代码:

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

很简单,在if语句外部声明它们并在内部赋值:

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

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

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

IEnumerable<FileInfo> list1 = dir1.GetFiles("*.*", allDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);

您还可以使用三元运算符并更改此

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

对此:

IEnumerable<FileInfo> list1 = allDirs?dir1.GetFiles("*.*", SearchOption.AllDirectories):dir1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
IEnumerable<FileInfo> list2 = allDirs?dir2.GetFiles("*.*", SearchOption.AllDirectories):dir2.GetFiles("*.*", SearchOption.TopDirectoryOnly);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM