c# - 在界面中使用泛型

标签 c# generics boxing unboxing

更新:

海因齐是对的。 AutoCAD 多段线是引用类型而不是结构。好点子。但我已经简化了场景,因为我在实际应用程序中处理的是一个结构化的 AutoCAD 对象。所以请将两者都视为结构而不是引用类型。


我正在寻找应对这种情况的正确方法,如果有人能阐明或帮助我更好地理解,我将不胜感激。

数据访问层中有一个接口(interface),有两个实现来处理两个不同的提供程序:AutoCad 和 Sketchup API。

interface IEntity
{
    void object GetPoly();
    void void   InsertPoly(object poly);
}

class AutocadEntity
{
    void object GetPoly()
    {
         //calling Autocad APIs
         return Autocad Polyline object
    }
    void InsertPoly(object poly){...}
}

GetPoly 的 Autocad 实现将返回 Polyline 对象,因为这是在 Autocad API 中定义为多段线的对象,而 Sketchup 将返回 Face 对象。

我已经将返回类型(和参数)定义为对象来处理这些不同的类型。成本是装箱/拆箱发生的性能问题。在返回/参数是 object[] 的地方,它更大胆地展示了自己。

我首先想知道使方法返回/参数类型通用是解决方案,但后来我认为这不会,因为实现是特定于类型的。

最佳答案

The cost is performance issue where boxing/unboxing happens.

我不这么认为。 Polyline是一个类,而不是一个结构。因此,不涉及拳击。

如果这实际上是您应用程序的性能瓶颈,那么您的性能就会在其他地方丢失。一如既往:在优化之前进行测量,否则您最终可能会优化错误的东西。

我认为您的解决方案非常好。您可以使用泛型并派生 AutocadEntity来自 IEntity<Polyline> ,但这有什么意义呢?由于 Polyline/Face 在您的界面中同时用作输入和输出参数,您可以制作 IEntity既不协变也不逆变。因此,最常见的基本类型 IEntity<Polyline>IEntity<Face>将是 object ,这意味着您不能再只传递一般的 IEntity如果您不知 Prop 体类型。

关于c# - 在界面中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32011316/

相关文章:

c# - 如何更改 PropertyGrid 的默认 CollectionEditor?

c# - 按名称调用动态对象的方法

c# - 在 new Thread() 中创建控件时在正确的线程上调用方法

c# - Unity registerType 泛型参数的多态解析

java - 为什么将短变量赋值给 Integer 引用会产生编译时错误?

C# - 装箱/拆箱/类型转换整数的问题。我不明白

c# - 如何在传递接口(interface)时访问不同具体类的属性

c# - 复杂泛型中的无效方差

c# - 泛型空重载构造函数以及何时不使用泛型

java - 拳击会导致性能问题吗?