[英]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.