C# 返回IList但使用列表

C# 返回IList但使用列表,c#,c#-2.0,C#,C# 2.0,声明方法的返回类型是否可以,例如IList小于您内部定义的返回类型,例如List?它会编译并运行吗 protected static IList<String> GetJobFiles(String folder, String fileExtension) { List<String> jobFiles = new List<String>(); if (System.IO.Directory.Exists(f

声明方法的返回类型是否可以,例如IList小于您内部定义的返回类型,例如List?它会编译并运行吗

   protected static IList<String> GetJobFiles(String folder, String fileExtension)
    {
        List<String> jobFiles = new List<String>();

        if (System.IO.Directory.Exists(folder))
        {
            string[] files = Directory.GetFiles(folder, fileExtension);

            // Check if for matching files
            if (files.Length > 0)
            {
                // add the files to our list collection
                jobFiles.AddRange(files);
            }

        }

        return jobFiles;
    }
受保护的静态IList GetJobFiles(字符串文件夹、字符串文件扩展名)
{
List jobFiles=new List();
if(System.IO.Directory.Exists(文件夹))
{
string[]files=Directory.GetFiles(文件夹,文件扩展名);
//检查是否有匹配的文件
如果(files.Length>0)
{
//将文件添加到我们的列表集合中
jobFiles.AddRange(文件);
}
}
返回作业文件;
}

这不仅很好,而且是很好的实践,也是将接口作为抽象的要点。见维基百科

它允许您使用
IList
的任何实现者(因此,不只是
List
,以防您想要更改内部实现)

至于“它是否会编译并运行”这个问题,答案是肯定的,但我鼓励你们自己去尝试。你会学到更多,比张贴在这里更快


正如@Dan Tao所评论的,请自己尝试,但要确认(在这里或与有经验的同事确认)。

因为IList比List更“通用”(在该列表中实现了IList接口),所以这是一种非常好的方法

是的,这就是接口的用途。您正在指定将返回实现列表接口的内容。如果你想有几个类(比如Dog、Cat、Bird等)都实现了IAnimal(比如有Feed()和Bath()方法),你可以让一个函数返回一个IAnimal,而不必具体说明你要返回哪种动物。

IList
接口由
List
string[]实现

因此,您可以返回
jobFiles
,或者,让我们说,在接下来的过程中,您决定不需要这样做,您只想直接返回
文件

您将方法定义为返回
IList
的实现,而不是
列表
,这一事实允许您在不影响任何外部代码的情况下执行此操作。这实际上是使用接口的主要目的之一


*这是假设您不会使用,例如,
添加
插入
,将返回值视为可变集合。否则,您实际上会影响外部代码;但从理论上讲,这至少是接口的好处之一。

请注意,根据返回值的预期用途,您甚至可以选择返回IEnumerable:

protected static IEnumerable<String> GetJobFiles(String folder, String fileExtension)
受保护的静态IEnumerable GetJobFiles(字符串文件夹、字符串文件扩展名)
这是更一般的,您可以在内部使用许多类型来构建列表(集合、队列、堆栈,或者只是使用yield的枚举器),而不会影响调用方

在这种情况下,函数的调用者可以在“作业文件”上循环,使用linq中的枚举(他也可以使用IList)


来电者不能修改列表(他不能添加或删除文件)。

+1因为你可以自己尝试,尤其是在IDE中键入上述内容要比尝试将其输入论坛更快。是的,但我强烈反对“自己尝试,而不是在论坛上发布”的心态;太多的开发人员自己尝试,发现某些东西是有效的,并从此将其视为一个“魔术”。我认为,向社区寻求建议和指导是一个很好的习惯,社区成员可能对该主题很了解……因此,换言之,我会说“除了在网上发帖之外,还要为自己尝试”(不是代替)@Dan Tao-我非常相信自我发现。我同意一个人应该得到指导,但是,一个人需要首先尝试自己学习。@Oded:是的,我想我只是觉得在这种情况下,OP可以自己尝试,得到答案“是的,它将编译并运行”,而不知道这是否是一个好的实践或好处是什么。这是我认为在询问别人更多信息方面有价值的。正如ODD所说的,这是一个很好的实践,但是你甚至可能想考虑额外的步骤并返回iQueDaby。然后,如果需要,可以通过使用yield使此方法使用延迟执行。