在多个窗体之间共享类

本文关键字:共享 之间 窗体 | 更新日期: 2023-09-27 18:32:11

我需要帮助来解决这个问题。我尝试过搜索,我想我可能已经找到了使用单例设计模式的解决方案,但想要确保。

我有一个用Visual C#编写的Windows窗体应用程序。我正在编写一个 SerialPort 类,以便可以通过所有表单共享它(我不需要多个串行端口实例)。这是为了将逻辑与 GUI 分开。所有形式都可以对SerialPort类进行各种更改,例如波特率,写入,读取等。

实施此解决方案的最佳方法是什么?我是 OOP 的新手,所以任何关于阅读的建议都会很棒。

在多个窗体之间共享类

正如您已经说过的,这个问题可以使用单例设计模式来解决。下面是一个小示例:

public class MySingleton() {
    private static MySingleton instance = new MySingleton();
    //your attributes go here...
    private MySingleton() {
    //your logic goes here...
    }
    public static MySingleton getInstance() {
        return instance;
    }
}

请注意,如果静态实例将用于多个线程,则类应锁定共享资源。我会让你参考线程安全代码

作为@Luiggi解决方案的替代方案,这里有一个更有意义的线程:

public sealed class SerialPort
{
  private static volatile SerialPort instance;
  private static object threadLock = new Object();
  /// <summary>Retrieve an instance of SerialPort</summary>
  public static SerialPort Instance
  {
    get
    {
      if (SerialPort.instance == null)
      {
        lock (SerialPort.threadLock)
        {
          if (SerialPort.instance == null)
          {
            SerialPort.instance == new Serialport();
          }
        }
      }
      return SerialPort.instance;
    }
  }
  private SerialPort(){}
}

然后,在实践中:

SerialPort sp = SerialPort.Instance;
sp.MyMethod(...);

有关此单例模式的详细信息。

实际上,我昨天刚刚遇到了同样的问题,我想我可能已经找到了一种更简单的方法来解决这个问题,而不是使用单例方法。我创建了一个类文件并创建了一个名为 public class Serial 的类。在里面,我将我的序列变量声明为 static SerialPort(即 static SerialPort serial );如果您需要使用计时器,则与计时器相同。为 set 创建一个函数并调用 serialStatus ,在其中设置一个public static bool。我真的很想在这里发布我的代码,但我真的不知道如何正确地做到这一点。在您的表单中,您将让第一个表单启动串行端口。对于另一种形式,您所要做的就是声明Serial serial = new Serial();提取方法,然后您就可以开始了。如果需要更改串行设置,则可以使用bool输入创建一个方法(即,如果true,则serial.Close();则使用新设置重新启动串行。