【发布时间】:2016-03-01 12:29:11
【问题描述】:
我正在开发某种 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);
需要计算每条消息的控制和。
有一个简单的解决方案:只需将 head 和 body 传递给构造函数,然后在 ZllnpMessage 内部计算。
好的,这是一个选项,但如果我想做下一个怎么办:
用属性初始化对象并提供类似的东西:
var message = new ZllnpMessage(saveHash: true)
{
Head = CreateHeader(Session.Opcodes.GetSessionToken),
Body = CreateBodyContent(secretPhrase)
};
然后,监视(可能使用带有 Lazy 的事件)属性值更改以实现以后的自动调用。
所以,我很困惑什么是更好的方法?请给我一点建议好吗?
请不要问我:
- 为什么选择 TCP?
- 为什么不用 TPL 和 Task?
答案:
- TCP,由于项目要求
- 不是 TPL,因为我使用的是带有手动控制、信号量等的旧线程模型(我知道,这很难等等...)
PS
另外,问题是关于构造函数的后期方法调用:) 不是项目设计
【问题讨论】:
-
真的不清楚你到底在问什么。如果您想在属性更改时调用
CalculateHash(),那么您必须实现INotifyPropertyChanged或自己滚动,并在每个属性的设置器中调用CalculateHash。或者,您可以首先在ToBinary()中调用CalculateHash,但这完全取决于您的用例以及您想要采用的方法。我们不知道,所以我们无法回答。另外,“构造函数的后期方法调用”并没有说明你到底想做什么,请详细说明。 -
@CodeCaster 我问的是为构造函数提供一个布尔值,如果它是真的,那么我想运行某种惰性评估来控制任何属性的变化与某种回调方法。该回调方法将检查计算哈希和的可用性。
-
@JamesThorpe 也是一个选项 :) 但我想要使用惰性评估更有趣的解决方案
标签: c# constructor call lazy-loading lazy-evaluation