在C#中使用类来“枚举对象”是一种很好的做法吗?

时间:2013-08-02 03:45:26

标签: c# animation enumeration

我知道对象枚举是Java对C#的少数几件事之一,有时我认为我错过了这个特性。

但我已经看到一些情况,一个类用于表示对象的枚举,使用常量字段,因此它可以“返回一个对象”,而不是一个int。

一个例子是Brushes类。它非常像枚举。

Brush b = Brushes.Blue;

我们可以看到主要区别(至少对我而言)是需要其他类(类Brush)来存储从类Brushes返回的值(一些具有隐式运算符重载的代码可以做到这一点)。 / p>

所以,我的问题是:良好的做法?

因为我正在考虑将这个用于我的项目中以制作动画(WPF)的枚举,以便用于我创建的CustomControl。

这对我来说似乎很好,并且比使用整数枚举更好,因为我需要检查一个switch-case来检测用户想要的动画。

2 个答案:

答案 0 :(得分:5)

在Java和C#中,枚举是一个根本不同的东西。在C#中,它们只是整数类型的名称,在Java中,它们更像是具有命名默认值的类。在C#中,一个带有一堆静态只读字段或属性的类就是Java所谓的枚举,减去switch对它们的能力。

这种模式偶尔出现,请参阅System.Drawing.ColorSystem.Text.Encoding

与大多数事情一样,只要你不滥用它,这是一个好习惯。此模式通常用于仅为类或结构提供命名的默认值。确保该类可以独立存在,并且您不会严重依赖这些属性的名称。如果您需要偶尔检查某些内容,那么您可能会因为==运营商超载而逃脱。

如果你想要一些与Java的枚举完全相同的东西,那么你应该有一个内部存储类型的C#枚举,并做两件事之一:

  1. 让所有构造函数都需要枚举
  2. 创建在内部设置枚举的命名默认值
  3. 示例:

    public enum FooType
    {
        A,
        B,
        C
    }
    
    public class Foo
    {
        public FooType Type { get; private set; }
    
        // Option 1: forced via constructor
    
        public Foo(FooType type)
        {
            this.Type = type;
        }
    
        // Option 2: static properties
        // (using the constructor from option 1, can be done without it, though)
    
        public static Foo A { get { return new Foo(FooType.A); } }
    
        public static Foo B { get { return new Foo(FooType.B); } }
    
        public static Foo C { get { return new Foo(FooType.C); } }
    }
    

    用法:

    Foo bar = new Foo(FooType.B);
    
    // OR
    
    Foo bar = Foo.B;
    

    能够切换:

    switch (bar.Type)
    {
        case FooType.A:
        break;
        case FooType.B:
        break;
        case FooType.C:
        break;
    }
    

答案 1 :(得分:3)

是的,它甚至有一个名字是可靠的。这是“Singleton pattern”。您只需创建一组单例并将它们设置为类的只读属性。它使用all over the framework