【问题标题】:Using enum as integer constant in C#在 C# 中使用枚举作为整数常量
【发布时间】:2011-01-21 04:55:34
【问题描述】:

我的问题很简单,但我没有找到一种方法来按照我想要的方式实现我的代码。所以我开始怀疑我要实现的代码是否不好。如果是,最好的方法是什么。

这里是:

class InputManager  
{  
    SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>();  

    public void Add(ushort id, Keys key) {...}  
    public bool IsPressed(ushort id) {...}  
}  

class Main  
{  
    private enum RegisteredInput : ushort  
    {  
        Up,  
        Down,  
        Confirm  
    }  

    public Main()  
    {  
            InputManager manager = new InputManager();

            manager.Add(RegisteredInput.Up, Keys.Q);
            manager.Add(RegisteredInput.Down, Keys.A);
            manager.Add(RegisteredInput.Confirm, Keys.Enter);
    }

    void update()
    {
    if(manager.IsPressed(RegisteredInput.Up)) action();
    }
}

这段代码无法编译,会出现这种错误:

“InputManager.Add(ushort, Keys)”的最佳重载方法匹配有一些无效参数
参数“1”:无法从“RegisteredInput”转换为“ushort”

如果我使用 manager.Add((ushort)RegisteredInput.Up, Keys.Q); 中的演员表,它将起作用。但是因为强制转换必须是明确的,所以我想知道它是否不像在 C++ 中那样在 C# 中推荐代码,以及是否有更好的方法(比如对每个值使用 const ushort,我有点不喜欢很多)。

到目前为止,我得到的最佳答案来自 this thread,但这听起来很像 hack,我很担心。

谢谢!

【问题讨论】:

  • 为什么字典没有定义为Dictionary&lt;RegisteredInput, Keys&gt;?另外,当你询问事情时,尽量避免将错误消息和代码重新输入网站,你做错了我们会挂断电话的机会就在那里。就像...异常消息实际上是否用 3 d 命名了方法“Addd”?我们如何相信您会实际复制所使用的实际代码,而不是重新输入完​​全有其他问题的简化代码?
  • 因为我不想重复键。关于错误消息,我没有重新输入,只是从中删除了很多不相关的命名空间。我还更改了方法的真实名称,因为它们不是英文的。
  • 我不明白您所说的“重复键”是什么意思。你能详细说明一下吗?
  • 嗯,一开始我似乎没有正确理解您的建议。对不起!我以为你在质疑是否使用 Dictionary 而不是 SortedDictionary。您的建议与 Adam Robinson 和 leppie 那里的建议几乎相同。再次抱歉!

标签: c# oop enums constants


【解决方案1】:

使 InputManager 成为泛型类型。即:

class InputManager<T>
{
   SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>();  

   public void add(T id, Keys key) {...}  
   public bool isPressed(T id) {...}    
}

【讨论】:

  • 不错!如此简单,但我并没有想到。我想我会选择这个解决方案。谢谢!
【解决方案2】:

Enums 需要隐式强制转换,我建议这样做:

public static class RegisteredInput {
    public const ushort Up = 0;
    public const ushort Down = 1;
    public const ushort Confirm = 2;
}

【讨论】:

  • 那么……比我快一分钟!显然,同上!
  • 但是你真的认为这是编写这段代码的更好方法吗,c#-wise?我不喜欢我必须模拟一个自动为枚举赋值的枚举的基本工作。
  • 过去遇到的许多技术问题让我最近远离了 Enums。我对所有常量都使用这种做法,无论它们是整数、字符串、日期等。它比 Enum 工作量大一点,但不是很多。
  • 我自己也尽量避免使用枚举,因为它们必须超出声明它们的类(或代码块)。我确实认为private enums 非常安全。
  • 我同意。尽管底层类型是 ushort,但在使用枚举时,您已经从 ushort 中抽象了一点点,并且编译器抱怨您出于非枚举原因使用枚举,因此是显式强制转换。如果您不想要强制转换,则需要更改签名以支持枚举,切换到类变量或仅重载 Add() 以同时支持枚举和 ushorts。
【解决方案3】:

为什么不直接使用枚举来定义字典呢?有什么理由需要它是一个 int 吗?

public void add(RegisteredInput id, Keys key) {...}  

另外,顺便说一句,通常建议可公开访问的成员(方法、类型等)应使用 pascal 大小写(换句话说,Add 而不是 add)。

【讨论】:

  • 关于帕斯卡大小写,它是原始的。我也会在这里纠正它。对不起!我不想直接使用枚举作为避免耦合的关键。
猜你喜欢
  • 2019-12-02
  • 1970-01-01
  • 2012-09-09
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多