我需要帮助解决这个问题。我试过搜索,我想我可能已经找到了使用单例设计模式的解决方案,但想确定一下。
我有一个用 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 和 get 创建一个函数serialStatus
,在其中设置 a public static bool
。我真的很想在这里发布我的代码,但我真的不明白如何正确地做到这一点。在您的表单中,您将让第一个表单启动串行端口。对于另一种形式,您所要做的就是声明Serial serial = new Serial();
提取方法,您就可以开始了。如果您需要更改串行设置,您可以创建一个带有 bool 输入的方法(即 if true
,serial.Close();
然后使用新设置重新启动串行。