使用全局常量或枚举而不指定类名

时间:2018-07-27 12:38:25

标签: c# .net enums constants

我正在将C程序迁移到C#,该程序仅侦听串行端口并解码传入的字节以构建命令包。因此,在名为“ protocol.h”的头文件中,我有一些常量变量和typedef。我需要在C#类中使用这些常量变量和typedef。

我创建了一个"protocol.cs"文件,该文件将保留常量。

//protocol.cs file

namespace SerialPort_Listener
{
    class constants
    {
        const byte PCK_SOP1 = 0xAA;
        const byte PCK_SOP2 = 0xCC;
        const byte PCK_EOP = 0x55;

        public enum CMD_IDs
        {
            ID_READ_VAR = 0,
            ID_WRITE_VAR,
            ID_READ_MEM,
            ID_WRITE_MEM,

            ID_COUNT    
        };

        public enum RET_VALs
        {
            PCK_READY = 0,
            PCK_NOT_RDY,
            PCK_INV_ID,
            PCK_CHK_ERR,

            VAL_COUNT
        };
    }
}

现在,我想将RET_VALs枚举用作另一个类文件中方法的返回类型。但是我需要这样使用它:

//decoder.cs file

namespace SerialPort_Listener
{
    class protocol
    {
        // C version: RET_VALs decode(uint8 recByte){}
        public constants.RET_VALs decode(byte recByte) 
        {
            // C version: if(recByte == PCK_SOP1){}
            if (recByte == constants.PCK_SOP1)         
            {
                // C version: return PCK_NOT_RDY; 
                return constants.RET_VALs.PCK_NOT_RDY; 
            }
        }        
    }       
}

是否有更好的方法来每次跳过引用类名constants?我搜索了有关在不同文件中定义常量的方法的文章,但大多数都使用此方法。

编辑:我想这很混乱。我也需要在所有其他CS文件中使用这些。因此,将枚举移出类是不够的,因为我仍然无法从另一个文件访问它们。

2 个答案:

答案 0 :(得分:4)

枚举不需要在类中:

namespace SerialPort_Listener
{
    class constants
    {
        const byte PCK_SOP1 = 0xAA;
        const byte PCK_SOP2 = 0xCC;
        const byte PCK_EOP = 0x55;
    }

    public enum CMD_IDs
    {
       ID_READ_VAR = 0,
       ID_WRITE_VAR,
       ID_READ_MEM,
       ID_WRITE_MEM,
       ID_COUNT    
   };

   public enum RET_VALs
   {
       PCK_READY = 0,
       PCK_NOT_RDY,
       PCK_INV_ID,
       PCK_CHK_ERR,
       VAL_COUNT
    };
}

您甚至可以为每个枚举创建一个单独的文件。

答案 1 :(得分:2)

看来,您正在寻找using static构造:

using static SerialPort_Listener.constants;
using static SerialPort_Listener.constants.RET_VALs;

那你可以放

// Now, there's no need to mention "constants" class here
if (recByte == PCK_SOP1)               
{
    // as well as the enum  
    return PCK_NOT_RDY;               
}