【问题标题】:Is the use of a class to "enumerate objects" in C# a good practice?在 C# 中使用类“枚举对象”是一种好习惯吗?
【发布时间】:2013-08-03 05:24:07
【问题描述】:

我知道对象枚举是 Java 超越 C# 的少数功能之一,有时我认为我错过了该功能。

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

一个例子是 Brushes 类。它的工作原理真的很像枚举。

Brush b = Brushes.Blue;

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

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

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

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

【问题讨论】:

  • 它...不像枚举那样工作。这些是返回冻结SolidColorBrushs 的静态只读属性。另外,“对象枚举是 Java 超越 C# 的少数东西之一”你在说什么?
  • 据我了解,C# 中的枚举不能表示与 int 不同的任何东西;例如java枚举可以表示字符串看这个问题。 stackoverflow.com/questions/3978654/java-string-enum 对不起,如果我不清楚,对不起我的英语。
  • 我也知道这不能用作枚举(我再次不清楚)。我只想知道使用我说的类是否可靠。
  • 这道题stackoverflow.com/questions/5250915/…是我想做的,而这道题的答案是类的使用,就像说的那样。

标签: c# animation enumeration


【解决方案1】:

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

这种模式每隔一段时间就会出现一次,请参阅 System.Drawing.ColorSystem.Text.Encoding

与大多数事情一样,只要您不滥用它,这是一种很好的做法。此模式通常用于只为类或结构提供命名默认值。确保该类可以独立存在,并且您不会严重依赖这些属性的名称。如果您需要偶尔检查某些内容,那么您可以通过重载 == 运算符来摆脱困境。

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

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

例子:

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;
}

【讨论】:

  • 是的,只是对示例的额外说明,不要将其用作替换继承或任何东西的方法(那会很混乱),我只是使用了FooType,因为它可以是任何东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2014-07-31
    • 2019-03-11
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多