从具有属性的构造函数调用 C# 延迟方法(可能是惰性求值)
C# Late method call from constructor with properties (possible lazy evaluation)
我正在开发某种 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 没有任务?
答案:
- TCP,因项目需求
- 不是 TPL,因为我使用的是带有手动控制、信号量等的旧线程模型(我知道,这很难等...)
PS
此外,问题是关于构造函数的延迟方法调用:)
不是项目设计
看来你的问题是"How can I control hash calculation by passing a value to the constructor"。如果你想在 属性 设置器中自动进行哈希计算,你可以选择关闭它,无论如何你都必须实现它。
您可以这样做:
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
}
}
我正在开发某种 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 没有任务?
答案:
- TCP,因项目需求
- 不是 TPL,因为我使用的是带有手动控制、信号量等的旧线程模型(我知道,这很难等...)
PS
此外,问题是关于构造函数的延迟方法调用:) 不是项目设计
看来你的问题是"How can I control hash calculation by passing a value to the constructor"。如果你想在 属性 设置器中自动进行哈希计算,你可以选择关闭它,无论如何你都必须实现它。
您可以这样做:
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
}
}