【发布时间】:2012-07-07 08:24:50
【问题描述】:
我有一个 API,其中包含一些接受类型参数的方法。我现在将它们转换为泛型方法,作为改进 API(更类型安全)的一部分,同时保留非泛型版本以实现向后兼容性。
当前 - 将被淘汰:
public object MyMethod(object value, Type expectedType)
新:
public T MyMethod<T>(object value)
然而,Mymethod 调用了一个私有的辅助方法,它也接受一个类型参数:
private object HelperMethod(object value, Type expectedType)
问题:我是否也应该将这个私有辅助方法设为通用?
我在下面有自己的答案,但我想知道我是否遗漏了什么。非常感谢您的见解。
我的回答是否定的,我不应该将这个私有方法设为通用。
原因 1:此辅助方法是私有的,因此即使我将其设为通用,它也不会改进 API。
原因2:如果我将其设为泛型,那么非泛型公共方法将不得不使用反射将类型参数传递给该泛型方法,这意味着更多开销。
【问题讨论】:
-
您说将其转换为泛型会因为反射而导致窃听,但了解 HelperMethod() 对该类型的作用会有所帮助。开销不是现在就在那里发生吗?
-
itsme86 - 我相信当 MyMethod 的非泛型版本使用反射调用泛型 HelperMethod 时会产生额外的开销。所以,HelperMethod 的开销不在图中……
-
值参数是否也将是 T 类型或者这是某种转换器?如果它是 T 类型,我肯定会建议制作该方法的通用版本以避免装箱/拆箱处罚。事实上,如果不是 T 类型,那么一个 T MyMethod
(U value) 来避免装箱呢? -
泛型的一个主要好处是它使代码快速。没有拳击,没有铸造。没有充分的理由让私有方法变慢。
-
itsme86 - value 参数仅用于此示例,但实际上它属于特定类型...但是,我肯定会在未来的场景中使用您的建议,谢谢!
标签: c# generics methods private