C#来自具有属性的构造函数的延迟方法调用(可能是延迟计算)

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

我正在开发某种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)
};
然后稍后,监视(可能使用带有惰性的事件)属性值的更改,以实现稍后的自动调用

所以,我很困惑什么是更好的方法?你能给我一个建议吗

请不要问我:

  • 为什么是TCP
  • 为什么第三方物流不能完成任务
答复:

  • TCP,因为项目要求
  • 不是TPL,因为我使用的是带有手动控制、信号量等的旧线程模型(我知道这很难,等等)
PS

另外,问题是关于构造函数的后期方法调用:)
不是项目设计

看起来您的问题是“如何通过将值传递给构造函数来控制哈希计算”。如果您想要在属性设置器中进行自动哈希计算(您可以选择关闭该设置),那么无论如何都必须实现它

您可以这样做:

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
    }
}