C#创建一个常量数组,然后使用它

时间:2017-01-26 11:46:17

标签: c# constants

我对C#很陌生。我已经为我的目标找到了几种解决方法,但是我正在使用框架的本机函数来询问最佳方法。

假设我必须开发一种通信协议。我需要为所需的函数存储一个常量(就绪)数组。即:

public static readonly IReadOnlyList<byte> CMD1 = new byte[] { 0x03, 0x55 };

稍后,我将定义一个SendCommand函数,该函数需要使用正确的命令,并使用参数和校验和完成它。像这样:

List<byte> msg = Commands.CMD1.ToList(); // <-- DOESN'T WORK
msg.Add(some_parameter);
msg.Add(checksum(msg));
serialPort.Write(msg.ToArray(), 0, msg.Count);

下面:

https://msdn.microsoft.com/it-it/library/hh192385(v=vs.110).aspx

似乎ToList()方法可用于IReadOnlyList接口,但编译器不接受它。

两个问题:

  1. 为什么我不能在这里使用ToList()方法?
  2. 有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

这段代码似乎非常关闭。您正在将只读列表转换为新列表,然后再转换回数组。

为什么不从一开始就使用数组,并依赖其余的底层接口?例如,您可能希望使用IEnumerable<byte>作为校验和方法,或者从一开始就使用字节数组。

public static readonly byte[] CMD1 = new byte[] { 0x03, 0x55 };

List<byte> msg = new List<byte>(CMD1);
msg.Add(some_parameter);
msg.Add(checksum(msg));
serialPort.Write(msg, 0, msg.Length);

答案 1 :(得分:0)

为什么不将命令放在枚举中,以便按名称选择它们。你不必全部记住它们。

public enum CommandsEnum
{
    Com1 = 0x03,
    Com2 = 0x05
}

然后,您可以轻松地将它们添加到集合中并在任何地方使用它们

var cmds = new List<byte>();

cmds.Add((byte)CommandsEnum.Com1);
cmds.Add((byte)CommandsEnum.Com1);

serialPort.Write(cmds.ToArray(), 0, cmds.Count);