C#中的可切换唯一标识符

Qua*_*ion 1 c# const uniqueidentifier switch-statement

我正在实现一个系统,用于在我正在编写的程序的不同部分之间发送消息.有一些通用的消息类型以及一些特定于程序的每个部分.我想避免从每个类型的基本消息类派生中固有的层次结构腐烂,所以我将这种类型封装在int或ushort中.然后,我使用"Messages"命名空间集中不同的类型,并使用一堆常量集中静态类.但是,我遇到了必须维护每个不同部分的唯一编号列表的问题:

namespace Messages
{
    public static class Generic
    {
        public const Int32 Unknown = 0;
        public const Int32 Initialize = 1;
        ...
        public const Int32 Destroy = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

其他地方

namespace Messages
{
    public static class Graphics
    {
        public const Int32 Unknown = 0;
        public const Int32 AddGraphic = 11; // <-- ?
    }
}
Run Code Online (Sandbox Code Playgroud)

拥有那么随意的11似乎很难,特别是如果我有其中的几个,保持和更新以确保没有碰撞似乎是一种痛苦.是否有一个简单的解决方案,以确保每个参考都是独一无二的?我尝试使用静态只读,在静态构造函数中将它们从Unique.ID()函数初始化,但如果我这样做,我无法切换()传递的Message类型,因为它说"预期的常量类型"对于每个案例.

Noo*_*ilk 7

你有没有使用枚举的原因?

public enum MessageTypes
{
    Unknown,
    Initialize,
    ...
}
Run Code Online (Sandbox Code Playgroud)

- 编辑:

仔细阅读我的评论,考虑一下

enum MessageType
{
    Update,
    Delete,
    Destroy
}

MessageType t = ...;

switch(t){
   case MessageType.Update:
       DoUpdate();
   }
}
Run Code Online (Sandbox Code Playgroud)

与:

interface IActionable
{
   void Do ();
}


public abstract class ActionableBase : IActionable
{
   // some other things

   public abstract void Do ();
}


public class UpdateAction : ActionableBase
{
   public override void Do ()
   {
       // Update Code
   }
}

...

IActionable a = ...;
a.Do();
Run Code Online (Sandbox Code Playgroud)

  • 总的来说,我真的认为你最好不要重新考虑你的设计.在C#中,出于消息识别的目的,你真的不应该有任何`int`常量.对于这样的事情,或者某种形式的继承/动作系统,你通常应该使用`enum`. (4认同)
  • 首先,OOPS的概念旨在减少切换和类型的陈述.您可以使用遗传和良好的层次结构重新设计,而不是转换和切换语句.精心设计的虚拟和重写方法更快,更易于维护. (2认同)