具有属性的构造函数的C#Late方法调用(可能的延迟评估)

时间:2016-03-01 12:29:11

标签: 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)
    };

    message.CalculateHash(saveHash: true);

    var data = message.ToBinary();
    socket.Send(data);
    socket.Receive();
}

在这里你可以看到这一行:

message.CalculateHash(saveHash: true);

需要计算每条消息的控制总和。

有一个简单的解决方案:只需通过头和头; body到构造函数,然后在ZllnpMessage内计算。

好的,这是一个选项,但如果我想做下一个怎么办?

使用属性初始化对象并提供类似的内容:

var message = new ZllnpMessage(saveHash: true)
{
    Head = CreateHeader(Session.Opcodes.GetSessionToken),
    Body = CreateBodyContent(secretPhrase)
};

然后,间谍(可能使用Lazy事件)属性值更改以实现以后的自动调用。

所以,我更混淆什么是更好的方法?你能给我一点建议吗?

请不要问我:

  • 为什么选择TCP?
  • 为什么TPL没有任务?

数目:

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

PS

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

1 个答案:

答案 0 :(得分:3)

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

你可以这样做:

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