【问题标题】:C# Late method call from constructor with properties (possible lazy evaluation)C# 从具有属性的构造函数调用延迟方法(可能的延迟评估)
【发布时间】:2016-03-01 12:29:11
【问题描述】:

我正在开发某种 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 和 Task?

答案:

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

PS

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

【问题讨论】:

  • 真的不清楚你到底在问什么。如果您想在属性更改时调用CalculateHash(),那么您必须实现INotifyPropertyChanged 或自己滚动,并在每个属性的设置器中调用CalculateHash。或者,您可以首先在ToBinary() 中调用CalculateHash,但这完全取决于您的用例以及想要采用的方法。我们不知道,所以我们无法回答。另外,“构造函数的后期方法调用”并没有说明你到底想做什么,请详细说明。
  • @CodeCaster 我问的是为构造函数提供一个布尔值,如果它是真的,那么我想运行某种惰性评估来控制任何属性的变化与某种回调方法。该回调方法将检查计算哈希和的可用性。
  • @JamesThorpe 也是一个选项 :) 但我想要使用惰性评估更有趣的解决方案

标签: c# constructor call lazy-loading lazy-evaluation


【解决方案1】:

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

您可以这样做:

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

不过,最直接的hash计算方法只是在序列化之前,所以在ToBinary()

public class ZllnpMessage
{
    public string Head { get; set; }

    public byte[] CalculateHash()
    {
        // return hash
    }

    public byte[] ToBinary()
    {
        CalculateHash();
        // return serialized message
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-05-17
    • 2021-08-13
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多