我应该让C#私有方法通用吗?

我应该让C#私有方法通用吗?,c#,generics,methods,private,C#,Generics,Methods,Private,我有一个API,其中包括一些接受类型参数的方法。我现在将它们转换为通用方法,作为改进API(更安全的类型)的一部分,同时保留非通用版本以实现向后兼容性 当前-待淘汰: public object MyMethod(object value, Type expectedType) 新的: 问题:我是否也应该将此私人助手方法设置为通用方法 下面我有我自己的答案,但我想知道我是否遗漏了什么。我非常欣赏你的见解 我的答案是否定的,我不应该让这个私有方法泛化 原因1:这个helper方法是私有的,所以即

我有一个API,其中包括一些接受类型参数的方法。我现在将它们转换为通用方法,作为改进API(更安全的类型)的一部分,同时保留非通用版本以实现向后兼容性

当前-待淘汰:

public object MyMethod(object value, Type expectedType)
新的:

问题:我是否也应该将此私人助手方法设置为通用方法

下面我有我自己的答案,但我想知道我是否遗漏了什么。我非常欣赏你的见解

我的答案是否定的,我不应该让这个私有方法泛化

原因1:这个helper方法是私有的,所以即使我将其设置为泛型,它也不会改进API


原因2:如果我将其设置为泛型,那么非泛型公共方法将不得不使用反射将类型参数传递给此泛型方法,这意味着更大的开销。

我认为这取决于您计划支持非泛型方法的时间、调用频率、对反射的影响,等等等等


我认为您会尽可能地想要通用功能,以利用您想要的类型安全性。然后,如果需要,对非泛型版本进行重新调整以使用泛型版本,并最终尽快弃用它。

通过在实现过程中始终保持泛型类型特异性,使您的私人助手方法泛型确实可以改进API。如果您将泛型限制到一个核心来处理无类型系统对象,那么您的实现就没有充分实现泛型的类型安全好处

例如,为什么MyMethod的参数仍然是System.Object?若该参数源自源代码,那个么它也应该是一个类型参数的可能性很大。如果参数来源于数据,则最好使用System.Object。泛型在与源代码一起使用时最有用,因为源代码表达式在大多数上下文中隐式提供类型

泛型的隐藏成本取决于将与API一起使用的类型的混合。如果大多数类型都是值类型(内置和结构),那么将API切换到泛型可能会增加内存消耗,因为对于每种值类型,泛型代码的jit方式必须不同。如果泛型API使用的大多数类型都是引用类型(类和接口),那么代码/内存爆炸就不必担心了,因为所有引用类型都共享相同的JIT代码

让旧的API调用新的泛型API的成本是否a)可测量,b)可接受完全取决于您在私有助手方法中所做的工作,特别是私有助手方法对类型参数所做的工作


如果辅助方法实现相当轻量级,并且通过性能测量(旧的API)来调用新的通用帮助器的成本是不可接受的,那么我会考虑将助手方法实现并排复制,一个是旧的样式,另一个是新的泛型样式。这消除了API样式之间的交叉转换成本,并消除了在旧API中引入新错误的风险,而代价是稍微增加内部代码维护工作。

您说将其转换为泛型会由于反射而导致无意中听到,但了解HelperMethod()会有所帮助他正在处理这个类型。我相信当MyMethod的非泛型版本使用反射调用泛型HelperMethod时,会产生额外的开销。因此,HelperMethod的开销不在图中……值参数也是T型的还是某种转换器?如果它是T型的,我肯定会建议创建该方法的通用版本,以避免装箱/拆箱惩罚。事实上,如果它不是T类型,那么使用T MyMethod(U值)来避免装箱呢?泛型的一个主要好处是它使代码速度更快。没有拳击,就没有投球。没有充分的理由让私有方法变慢。itsme86-value参数仅用于此示例,但实际上它是一种特定类型的。。。不过,我肯定会在未来的场景中使用您的建议,谢谢!MyMethod()的非泛型版本仍然被广泛使用,我不希望给它们增加开销。我想他们会在这待上一段时间。我为所有公共方法提供了一个通用版本。但我的问题是,我是否应该用“私人助手”方法来解决这个问题?(成为一名优秀的开发人员、纯粹主义者等)谢谢你给我一个很有洞察力和教育性的建议。我倾向于复制helper方法。它的实现不是轻量级的,但是维护工作是可管理的。通过这种方式,我可以确保我已经对泛型进行了更彻底的转换。
public T MyMethod<T>(object value)
private object HelperMethod(object value, Type expectedType)