【问题标题】:Variable Reference to Other Variable变量引用其他变量
【发布时间】:2020-06-30 08:09:31
【问题描述】:

我有两节课。

一个有关于类的数据,另一个在串行通信时发送数据。

例子

class Data
{
    public int Voltage = 10;
}


class ForCommunication
{
    public object values;
}
...

// Main Form
Data Data = new Data();
private void SetValue
{
    ForCommunication fc = new ForCommunication();
    fc.values = Data.Voltage;
}

即使 fc.values 被串行通信改变,Data.Voltage 也不会改变。

我想在 fc.values 更改时更改 Data.Voltage。

例子

// init values
Data.Voltage = 10;
fc.values = Data.Voltage;
fc.values = 10;
// Data.Voltage : 10, fc.values : 10

// fc.values change
fc.values = 15;
// and I want Data.Voltage change
// fc.values : 15, Data.Voltage : 15

在 C# 上可以吗?

我应该另寻出路吗?

【问题讨论】:

  • 在 C# 中没有 int 的引用类型,请参阅stackoverflow.com/questions/30296734/…,也许包装类可以帮助您
  • 为什么要使用引用类型?另一方面,这个设计是不是让你从一些作品中解脱出来?这个设计看起来有点怪。

标签: c# reference pass-by-reference


【解决方案1】:

这似乎是一个设计问题。我没有提供直接的答案,但提供了一个将来更易于维护的解决方案。

如果我的建议与您的用例不符,请编辑。

您的用例中有 2 个角色(类)。

  1. 串行通信不断接收数据。
  2. 我假设您有一个纯数据(模型)可供查看。

我的建议是让串行通信在接收到数据时触发更改事件。

带有代表的SerialComm 用于通知收到的数据。

    public class SerialComm
    {
        delegate void DataReceived( int value );
        public DataReceived NotifyDataReceived;

        void polling()
        {
            // ...
            int data = 0;
            // Found data
            data = somevalue;
            NotifyDataReceived?.Invoke( data );
            // ...
        }
    }

在主窗体,当 SerialComm.NotifyDataReceived 触发时更新您的数据。

    // mainform
    class Data
    {
        public int Value;
    }
    Data m_Data = new Data();
    SerialComm m_Comm;

    void Init()
    {
        m_Comm = new SerialComm();
        m_Comm.NotifyDataReceived += OnDataReceived;
    }

    void OnDataReceived( int value )
    {
        m_Data.Value = value;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2012-09-08
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多