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>
不隐藏(通过显式接口(interface)实现)旧的 GetEnumerator() 方法?隐藏旧方法会破坏与旧扩展的二进制兼容性(例如Method not found: 'System.Collections.IEnumerator Fiddler.HTTPHeaders.GetEnumerator()
'.)
结果
*正如下面 Servy 的回答所指出的,在添加返回类型专用枚举器的公共(public) GetEnumerable() 时,没有简单的方法可以避免破坏二进制兼容性。
但是,在我的具体情况下,我有点幸运。 HTTPHeaders 是一个基类,几乎所有调用者都使用两个派生类(HTTPRequestHeaders 和 HTTPResponseHeaders)之一。我已将公共(public)通用 GetEnumerator() 方法添加到每个派生类中。这些新的特定于类型的枚举器由针对新版本编译的代码调用,而尚未重新编译的旧插件仍然从基类中检索非通用枚举器。*
最佳答案
您需要提供一些 GetEnumerator 方法来返回实际的 HTTPHeaderItem 类型以避免转换。这意味着要么实现
IEnumerable<HTTPHeaderItem>
或者有一个隐含的GetEnumerator
方法返回实际类型。在一般情况下,这意味着您可以依赖 Duck typing,而不是实现IEnumerable<T>
,但在您的情况下,由于签名错误的此类方法已经存在,因此这是不可能的。当然可以。只需隐藏
IEnumerable<HTTPHeaderItem>
实现而不是IEnumerable
执行。这正是数组的作用(以保持二进制兼容性)。
这是一个简单的例子:
public class Foo : IEnumerable, IEnumerable<HTTPHeaderItem>
{
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator<HTTPHeaderItem> IEnumerable<HTTPHeaderItem>.GetEnumerator()
{
throw new NotImplementedException();
}
}
关于c# - 是否可以在不破坏二进制兼容性的情况下升级到 Generic IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634346/