【问题标题】:Generics question (Type parameters vs Constructors)泛型问题(类型参数与构造函数)
【发布时间】:2009-03-02 17:35:42
【问题描述】:

如果你有一个自定义的集合类,它在 floats/double 中分别存储单个水果类的权重,如下所示:

1.1, 3.3, 6.6, 4.4, ...

您需要指定它是浮点型还是双精度型并区分水果类型,这样做更好吗:

使用枚举:

FruitList<float, FruitType.Orange>

在构造函数中使用枚举:

FruitList<float> (FruitType.Orange)

使用类:

FruitList<float, Orange>

在构造函数中使用类:

FruitList<float> (Orange)

让我感到困惑的是在 区域中指定这些东西是否有意义(不知道那个区域叫什么)?

哪种做法更好、更快、更有效?

顺便说一句,Orange 类从不在任何地方使用,如果指定这样的类型有意义就写它?

编辑:顺便说一句,这只是一个示例案例,而不是实际案例,但这以一种清晰的方式反映出来。就像它都是浮点数/双精度数并传递给其他一些方法。但是这些方法需要知道正确执行哪种水果。水果本身没有任何意义。

【问题讨论】:

    标签: c# .net generics class


    【解决方案1】:

    首先,枚举值不是类型,所以示例

    FruitList<float, FruitType.Orange>
    

    行不通。如果您想确保您的通用列表静态类型为Orange,您将不得不使用这个

    FruitList<float, Orange>
    

    即使你永远不会使用Orange 类。在我看来,可能不需要,因为您可以在变量名中传达类型:

    FruitList<float> orangeWeights = new FruitList<float>(FruitType.Orange);
    

    【讨论】:

      【解决方案2】:

      FruitList&lt;float&gt;(FruitType.Orange) 可能是要走的路。

      float 只能是类型参数。 水果类型只是一个属性。创建单独的类型并为其使用类型参数是没有意义的。

      【讨论】:

        【解决方案3】:

        取决于你的橙色是否只是一个......标签......就像颜色。汽车可以是蓝色和红色,但仍然是“相同”的汽车。如果您希望 Orange 能够做一些特别的事情,不同于普通水果或苹果的事情,我创建了一个抽象 Fruit 类和一个 Orange 子类,然后使用 事物。如果只是一个标签的东西,比如颜色,那么我猜枚举可以做得很好。

        我认为通过使用类/结构来进行类型检查等会更容易。比如,如果有人试图在你的水果清单中添加一些苹果类型的水果会发生什么?会变成橘子吗?是否必须检查水果的水果类型是否为橙色?如果不是,会发生什么?参数异常?

        我想我会去上课和东西。但这就是我。实际上,如果是我,我想我会继续使用decimal 来测量重量和其他需要测量的东西......然后有类似的东西(完全错误的语法等,但你希望得到这个想法):

        class FruitList<TFruit> where TFruit : Fruit {}
        
        abstract class Fruit {public abstract decimal Weight {get; protected set; }}
        
        class Orange : Fruit { ... }
        

        【讨论】:

        • hm,那个双发是怎么发生的??
        • 这很奇怪。那么错误?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2019-07-05
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2010-10-16
        相关资源
        最近更新 更多