公开接口而不是具体类

g_b*_*g_b 2 c#

我最近阅读了一些关于在暴露集合而不是具体实现时使用接口的东西(IEnumerable而不是List).我现在正试着在我的代码中这样做.但是,当我公开一个返回IEnumerable的属性时,我遇到了一些不允许空值作为返回值的困难.例:

public class HumanResource
{
    public IEnumerable<EmployeeModel> Employees
    {
        get
        {
            // return what?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该在吸气剂中返回什么?我不想为此使用自动属性,因为我想避免空值.我想要的是返回一个没有项目的新集合.当然我可以返回任何实现IEnumerable的类型,但该类的外部用户将如何知道?或者我是否理解这个暴露界面而不是具体的实现错误?

编辑:删除了二传手

Cod*_*ter 5

当然我可以返回任何实现IEnumerable的类型,但该类的外部用户将如何知道?

他们不必知道,这正是重点.

你的财产承诺返回IEnumerable<EmplyeeModel>,这正是发生的事情.代码返回的实现此接口的类无关紧要.

我想要的是返回一个没有项目的新集合.

所以,Enumerable.Empty<EmplyeeModel>()或者new List<EmployeeModel>()会做得很好.


在设计API时,您需要考虑消费者对您返回的数据类型的处理方式,并相应地做出决定.

通常一个IEnumerable<T>集合适合每个人.当他们想要它在列表中时,他们可以做new List<T>(yourEnumerable),或者yourEnumerable.ToArray()将它用作数组.