【发布时间】:2013-01-16 01:26:12
【问题描述】:
Fiddler 的 HTTPHeaders 类有一个成员 Storage,它是一个 List<HTTPHeaderItem>。
HTTPHeaders 类因此以 .NET 1.1 样式公开了一个枚举器:public System.Collections.IEnumerator GetEnumerator()。这个方法只返回Storage.GetEnumerator()。
问题:
不实现
IEnumerable<HTTPHeaderItem>是否会降低性能?还是foreach(HTTPHeaderItem in oHTTPHeaders)的编译足够聪明,可以识别出它返回的对象也实现了IEnumerable的特定类型版本,避免了一堆强制转换?实现
IEnumerable<HTTPHeaderItem>而不隐藏(通过显式接口实现)旧的GetEnumerator() 方法是否甚至可能?隐藏旧方法会破坏与旧扩展的二进制兼容性(例如Method not found: 'System.Collections.IEnumerator Fiddler.HTTPHeaders.GetEnumerator()'。)
结果
*正如下面 Servy 的回答所指出的,在添加返回类型专用枚举器的公共 GetEnumerable() 时,没有简单的方法可以避免破坏二进制兼容性。
但是,在我的具体情况下,我有点幸运。 HTTPHeaders 是一个基类,几乎所有调用者都使用两个派生类之一(HTTPRequestHeaders 和 HTTPResponseHeaders)。我已经为每个派生类添加了公共通用 GetEnumerator() 方法。这些新的特定于类型的枚举器由针对新版本编译的代码调用,而尚未重新编译的旧插件仍然从基类中检索非泛型枚举器。*
【问题讨论】:
-
你可以明确地实现
IEnumerable<HTTPHeaderItem>。非通用版本将是公开版本,不应破坏兼容性。不过,我不知道foreach循环会使用哪一个。 -
正如 Servy 的回答中所阐述的那样,foreach() 最终使用了公共的。
标签: c# ienumerable