C#来自具有属性的构造函数的延迟方法调用(可能是延迟计算)
我正在开发某种TCP服务器,并得出了一个令人讨厌的结论 下面是一段代码:C#来自具有属性的构造函数的延迟方法调用(可能是延迟计算),c#,constructor,call,lazy-loading,lazy-evaluation,C#,Constructor,Call,Lazy Loading,Lazy Evaluation,我正在开发某种TCP服务器,并得出了一个令人讨厌的结论 下面是一段代码: public void GetSessionId(byte[] secretPhrase) { var message = new ZllnpMessage { Head = CreateHeader(Session.Opcodes.GetSessionToken), Body = CreateBodyContent(secretPhrase) }; mes
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)
};
然后稍后,监视(可能使用带有惰性的事件)属性值的更改,以实现稍后的自动调用
所以,我很困惑什么是更好的方法?你能给我一个建议吗
请不要问我:
- 为什么是TCP
- 为什么第三方物流不能完成任务
- TCP,因为项目要求
- 不是TPL,因为我使用的是带有手动控制、信号量等的旧线程模型(我知道这很难,等等)
不是项目设计看起来您的问题是“如何通过将值传递给构造函数来控制哈希计算”。如果您想要在属性设置器中进行自动哈希计算(您可以选择关闭该设置),那么无论如何都必须实现它 您可以这样做:
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()
中:
不清楚你到底在问什么。如果要在属性更改时调用
CalculateHash()
,则必须实现INotifyPropertyChanged
或自行滚动,并在每个属性的setter中调用CalculateHash
。或者,您可以调用ToBinary()
中的CalculateHash
第一件事,但所有这一切都完全取决于您的用例和您想要采取的方法。我们不知道,所以我们无法回答。另外,“从构造函数晚调用方法”并没有明确说明您到底想做什么,请详细说明。@CodeCaster我想问的是关于向构造函数提供布尔值的问题,如果是真的,那么我想运行某种延迟求值,用某种回调方法控制任何属性的更改。该回调方法将检查计算哈希和的可用性。@JamesThorpe还有一个选项:),但我希望使用惰性计算得到更有趣的解决方案
public class ZllnpMessage
{
public string Head { get; set; }
public byte[] CalculateHash()
{
// return hash
}
public byte[] ToBinary()
{
CalculateHash();
// return serialized message
}
}