从具有属性的构造函数调用 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 的事件)属性 值更改以实现稍后的自动调用。

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

请不要问我:

答案:

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