c#变量的可见性
我提取了一些代码来比较两个目录,所有的工作都很好,但是我想为了我的目的对其进行改进,这样我就可以根据稍微不同的需求回收代码。原始代码列出了所有目录,但我想添加一个开关,这样我就可以决定是列出所有目录还是只列出顶级目录。下面是我的代码片段c#变量的可见性,c#,scope,C#,Scope,我提取了一些代码来比较两个目录,所有的工作都很好,但是我想为了我的目的对其进行改进,这样我就可以根据稍微不同的需求回收代码。原始代码列出了所有目录,但我想添加一个开关,这样我就可以决定是列出所有目录还是只列出顶级目录。下面是我的代码片段 public void DoCompare(string pathA, string pathB, bool allDirs) { DirectoryInfo dir1 = new DirectoryInfo(pathA); DirectoryI
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);
public void DoCompare(字符串路径A、字符串路径B、bool-allDirs)
{
DirectoryInfo dir1=新的DirectoryInfo(路径);
DirectoryInfo dir2=新的DirectoryInfo(路径B);
if(allDirs)
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.AllDirectories);
IEnumerable list2=dir2.GetFiles(“**”,SearchOption.AllDirectories);
}
其他的
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.TopDirectoryOnly);
IEnumerable list2=dir2.GetFiles(“**”,SearchOption.TopDirectoryOnly);
}
//稍后定义的自定义文件比较器
FileCompare myFileCompare=新建FileCompare();
bool areedename=list1.SequenceEqual(list2,myFileCompare);
现在,如果没有if(allDirs),这很好。当我把它放进去时,列表1和列表2在最后一行代码中不可见。实际的错误是“名称列表1在当前上下文中不存在”。我尝试在if之外声明它们,但这依赖于它们返回的结果,如果没有决定,这是不可能的。那么我如何使它们在if语句之外可见呢?很简单,在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);
}
很简单,在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);
}
它们不可访问,因为它们是在
if/else
的作用域中定义的。有关详细信息,请参阅
您可以在Mark的回答中定义它们,但可以将if-else改为只处理whichSearchOption
。这样您就没有代码重复:
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());
var option=allDirs?SearchOption.AllDirectories:SearchOption.TopDirectoryOnly;
IEnumerable list1=(新目录信息(路径)).GetFiles(“**”,选项);
IEnumerable list2=(新目录信息(pathB)).GetFiles(“*.*”,选项);
bool areedential=list1.SequenceEqual(list2,newfilecompare());
它们不可访问,因为它们是在if/else
的范围内定义的。有关详细信息
您可以在Mark的回答中定义它们,但可以将if-else改为只处理whichSearchOption
。这样您就没有代码重复:
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());
var option=allDirs?SearchOption.AllDirectories:SearchOption.TopDirectoryOnly;
IEnumerable list1=(新目录信息(路径)).GetFiles(“**”,选项);
IEnumerable list2=(新目录信息(pathB)).GetFiles(“*.*”,选项);
bool areedential=list1.SequenceEqual(list2,newfilecompare());
它不可访问,因为它是在内部作用域中声明的,而在外部作用域中不可见。但是您只想根据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());
SearchOption opt=allDirs?SearchOption.AllDirectories:SearchOption.TopDirectoryOnly;
IEnumerable list1=dir1.GetFiles(“*.*”,opt);
IEnumerable list2=dir2.GetFiles(“*.*”,opt);
bool areedential=list1.SequenceEqual(list2,newfilecompare());
如果你不能这样做,你必须在外面申报:
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
IEnumerable列表1;
IEnumerable列表2;
if(allDirs)
{
list1=。。。
列表2=。。。
}
其他的
{
列表1=。。。
列表2=。。。
}
//现在您可以在这里访问它们,因为它们是在同一范围内声明的
它不可访问,因为它是在内部作用域中声明的,而在外部作用域中不可见。但是您只想根据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());
SearchOption opt=allDirs?SearchOption.AllDirectories:SearchOption.TopDirectoryOnly;
IEnumerable list1=dir1.GetFiles(“*.*”,opt);
IEnumerable list2=dir2.GetFiles(“*.*”,opt);
bool areedential=list1.SequenceEqual(list2,newfilecompare());
如果你不能这样做,你必须在外面申报:
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
IEnumerable列表1;
IEnumerable列表2;
if(allDirs)
{
列表1=。。。
列表2=。。。
}
其他的
{
列表1=。。。
列表2=。。。
}
//现在您可以在这里访问它们,因为它们是在同一范围内声明的
您也可以使用三元运算符来更改此设置
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);
}
if(allDirs)
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.AllDirectories);
IEnumerable list2=dir2.GetFiles(“**”,SearchOption.AllDirectories);
}
其他的
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.TopDirectoryOnly);
IEnumerable 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);
IEnumerable list1=allDirs?dir1.GetFiles(“**”,SearchOption.AllDirectories):dir1.GetFiles(“**”,SearchOption.TopDirectoryOnly);
IEnumerable list2=allDirs?dir2.GetFiles(“*.*”,SearchOption.AllDirectories):dir2.GetFiles(“*.*”,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);
}
if(allDirs)
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.AllDirectories);
IEnumerable list2=dir2.GetFiles(“**”,SearchOption.AllDirectories);
}
其他的
{
IEnumerable list1=dir1.GetFiles(“**”,SearchOption.TopDirectoryOnly);
IEnumerable 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);
IEnumerable list1=allDirs?dir1.GetFiles(“**”,SearchOption.AllDirectories):dir1.GetFiles(“**”,SearchOption.TopDirectoryOnly);
IEnumerable list2=allDirs?dir2.GetFiles(“*.*”,SearchOption.AllDirectories):dir2.GetFiles(“*.*”,SearchOption.TopDirectoryOnly);
@skinypete63 np,你也可以用条件运算符“?”来简化代码,不是程序员,只是试着过日子,所以:list1=(allDirs)?dir1.GetFiles(“.”,SearchOption.AllDirectories):dir1.GetFiles(.”,SearchOption.TopDirect