返回IList但使用List

时间:2010-12-21 15:11:01

标签: c# c#-2.0

是否可以声明方法的返回类型,例如IList比你在内部定义它少,例如名单?它会编译运行吗?

   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;
    }

5 个答案:

答案 0 :(得分:8)

这不仅是好的,而且是良好的实践以及将接口作为抽象的全部观点。请参阅维基百科上的LSP

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

关于“它会编译运行”的问题 - 答案是肯定的,但是,我鼓励你自己尝试。您将在此处了解更多,更快...

正如@Dan Tao评论,请亲自尝试,但要确认(无论是在这里还是与有经验的同事一起)。

答案 1 :(得分:4)

IList<string>接口由List<string>string[]实现。

所以你可以返回jobFiles,或者,让我们说你认为没有必要,你想直接返回files

您已将方法定义为返回IList<string>而不是List<string>的实现,这样您就可以执行此操作而不会影响任何外部代码 *。这实际上是使用接口的主要目的之一。

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

答案 2 :(得分:1)

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

protected static IEnumerable<String> GetJobFiles(String folder, String fileExtension)

这更为通用,您可以在内部使用多种类型来构建列表(集合,队列,堆栈或仅使用yield的枚举器),而不会影响调用者。

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

调用者无法修改列表(他无法添加或删除文件)。

答案 3 :(得分:0)

由于IList比List更“通用”(在该List中实现了IList接口),因此这是一种非常好的方法。

答案 4 :(得分:0)

是的,这就是界面的目的。您指定将返回实现列表界面的内容。如果你想要几个类(Say Dog,Cat,Bird等)都实现了IAnimal(Say有Feed()和Bath()方法)你可以让一个函数返回一个IAnimal而不具体说明哪种类型的动物你会回来的。