我正在开发某种TCP服务器并且已经结束了一件令人讨厌的事情。
这是一段代码:
public void GetSessionId(byte[] secretPhrase)
{
var message = new ZllnpMessage
{
Head = CreateHeader(Session.Opcodes.GetSessionToken),
Body = CreateBodyContent(secretPhrase)
};
message.CalculateHash(saveHash: true);
var data = message.ToBinary();
socket.Send(data);
socket.Receive();
}
在这里你可以看到这一行:
message.CalculateHash(saveHash: true);
需要计算每条消息的控制总和。
有一个简单的解决方案:只需通过头和头; body到构造函数,然后在ZllnpMessage
内计算。
好的,这是一个选项,但如果我想做下一个怎么办?
使用属性初始化对象并提供类似的内容:
var message = new ZllnpMessage(saveHash: true)
{
Head = CreateHeader(Session.Opcodes.GetSessionToken),
Body = CreateBodyContent(secretPhrase)
};
然后,间谍(可能使用Lazy事件)属性值更改以实现以后的自动调用。
所以,我更混淆什么是更好的方法?你能给我一点建议吗?
请不要问我:
数目:
PS
另外,问题是关于构造函数的后期方法调用:) 不是项目设计
答案 0 :(得分:3)
看起来您的问题是"如何通过将值传递给构造函数" 来控制哈希计算。如果您希望在属性设置器中进行自动哈希计算,您可以选择关闭它,那么您无论如何都必须实现它。
你可以这样做:
public class ZllnpMessage
{
private bool _autoHash;
private string _head;
public string Head
{
get { return _head; }
set
{
_head = value;
if (_autoHash)
{
CalculateHash();
}
}
}
public ZllnpMessage(bool autoHash)
{
_autoHash = autoHash;
}
public byte[] CalculateHash()
{
// return hash
}
public byte[] ToBinary()
{
// return serialized message
}
}
然而,最简单的哈希计算方法仅在序列化之前,所以在ToBinary()
:
public class ZllnpMessage
{
public string Head { get; set; }
public byte[] CalculateHash()
{
// return hash
}
public byte[] ToBinary()
{
CalculateHash();
// return serialized message
}
}