C#Downcasting列出IList"特殊战术"

Ben*_*ens 2 c#

所以我在一家公司工作,我在这里相对比较新,但我在一些生产代码中遇到了一些非常奇怪的东西,我告诉他们是由一个在C#中更有知识的人写的,而不是"我做了特别的事".办法".因此,我试图想出理由去做我要解释的事情,给出怀疑的好处,但我无法想出任何东西.

IList<Facility> Facilities = new List<Facility>();

上面这一行是问题的核心......整个代码中的其他奇怪之处在于无法使用某些东西的接口,因此在使用它们之前必须将数据复制回List中(例如导出通过webservice,不允许使用接口,必须是IList的实现)

现在我理解接口是很棒的,你可以编写方法,期望接口中的方法存在于传递给你的方法的实现上但是...

有人可以帮助我在这里...任何人都可以想到你立即将List转发回应用程序数据层中的界面的原因吗?

另外,为了清楚起见......这些列表也不用于可互换的数据类型,这发生在定义和存储List的位置,并且存储了每个数据类型的IList.

谢谢!

Dar*_*rov 6

在层次结构中使用尽可能高的类是一种良好的做法.因此,如果您只需要遍历值,则只应公开IEnumerable<T>:

IEnumerable<Facility> Facilities = new List<Facility>();
// now you can foreach over the facilities or chain with LINQ
Run Code Online (Sandbox Code Playgroud)

如果您需要索引器访问权限,则可以使用 IList<Facility>

IList<Facility> Facilities = new List<Facility>();
// in addition to looping now you can access facilities by index 
// and you can also add and remove facilities
Run Code Online (Sandbox Code Playgroud)

在设计某些API时,在层次结构中暴露最高级别/接口背后的想法是,这样您就隐藏了您正在使用的实现细节List<T>.如果您明天发明了一个HyperSpecialListWhichIsVeryFast<T>实现与API消费者达成协议的合同,则此消费者不需要更改其代码中的任何内容.他不在乎.他合作是IEnumerable<T>因为他所需要的只是循环.感谢您的新列表,他的代码运行得更快,而无需更改任何内容.

但是现在使用历史书中的非通用的.NET 1.0弱类型集合就像伏都教魔法:

IList Facilities = new List<Facility>();
Run Code Online (Sandbox Code Playgroud)

想不出有什么理由这会有用.向下转换为非泛型版本将强制客户端进行转换以访问基础类型T.这样他就失去了泛型提供的所有编译时安全性.