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