我对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
接口,但编译器不接受它。
两个问题:
ToList()
方法?答案 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);