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改为只处理which
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());
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改为只处理which
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());
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