小编Jan*_*nis的帖子

C#替代枚举的:m-relation

枚举中的值范围有多个线程(不可能).但我有以下问题并搜索最佳解决方案,其中没有一个提供曾经真的让我满意.

协议规范说消息的byte [x],messagetype,具有以下可能的值(幻想值):

0x00 = get
0x01 = set 
0x02 to 0xFF = identify
Run Code Online (Sandbox Code Playgroud)

因此,只有3种不同的逻辑选项,最好在枚举中处理.但是,n个逻辑选项中的一个具有m个不同的数字对应物,这在枚举中是不可能处理的.

现在这个问题的最佳(最干净)解决方案是什么?我可以建立一个班级

class MessageType {
    public enum MessageTypeEnum {
        get = 0x00, 
        set = 0x01, 
        identify = 0x02
    }

    public static MessageTypeEnum getLogicalValue (byte numericalValue)
    {
       if (numericalValue < 0x02) 
          return (MessageTypeEnum(numericalValue)); 
       else
          return MessageTypeEnum.identify;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也可以创建一个没有枚举的类,但是使用静态成员.

无论哪种方式都存在一个问题:如果有人试图发送数据包,他可能会使用

if (messageBytes[x] == (byte)MessageTypeEnum.identify) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

但是messageByte [x]可以是0x02和0xFF之间的任何值,因此"点击"枚举中指定的值将是纯粹的运气.另一方面,我希望将enum(或静态成员)公开以便于构建消息.

我可以以某种方式强制使用我的getLogicalValue() - 函数?有更优雅的解决方案吗?

我想要的是一种简单且结构良好的方法,可以将逻辑值链接到:m关系中的数值.特别是因为给定的协议有很多这样的情况,我想保持我的代码整洁.

谢谢你的帮助和时间:)

贾尼斯

c# enums casting

6
推荐指数
1
解决办法
332
查看次数

从字符数组转换时的字符串长度

我遇到了严重的字符串处理问题.由于我的问题很难描述,我将从一些演示代码开始再现它们:

Dim s1 As String = "hi"
Dim c(30) As Char
c(0) = "h"
c(1) = "i"
Dim s2 As String = CStr(c)
s2 = s2.Trim()
If not s1 = s2 Then
   MsgBox(s1 + " != " + s2 + Environment.NewLine + _
          "Anything here won't be printed anyway..." + Environment.NewLine + _ 
          "s1.length: " + s1.Length.ToString + Environment.NewLine + _
          "s2.length: " + s2.Length.ToString + Environment.NewLine)
End If                    
Run Code Online (Sandbox Code Playgroud)

结果消息框如下所示:

消息框的屏幕截图仅显示hi!= hi但不显示文本的其余部分

这种比较失败的原因是s2的长度为31(来自原始数组大小),而s1的长度为2.

当从字节数组中读取字符串信息时,我经常偶然发现这种问题,例如,当处理来自MP3或具有预定长度的其他编码(ASCII,UTF8,...)信息的ID3Tag时.

是否有任何快速而干净的方法来防止这个问题?

将s2"修剪"为调试器显示的字符串的最简单方法是什么?

先谢谢,Janis

.net vb.net arrays string

4
推荐指数
1
解决办法
1208
查看次数

标签 统计

.net ×1

arrays ×1

c# ×1

casting ×1

enums ×1

string ×1

vb.net ×1