给C#表单一个指向同一表单的唯一实例的静态属性是不是一个坏主意?

时间:2015-05-28 10:21:14

标签: c# winforms static

我有一个相当简单的应用程序,它监视文件夹活动并将其记录在服务器上。 在这个应用程序中,我从一个名为Form1的Form对象开始。在这个表格上我有一个NotifyIcon。因为我需要在整个过程中从不同的Form中更改NotifyIcon的BalloonTip中的文本,所以我在考虑设置Form1的静态属性,该属性将指向Form1的唯一实例。这就是我的观点:

public partial class Form1 : Form
{
    private static Form1 staticRef;
    // Other private properties

    public Form1()
    {
        InitializeComponent();
        staticRef = this;
        // Rest of constructor logic
    }
    public static void changeNotifyBalloonText(String newText, int timeInMillis)
    {
        if (staticRef != null && staticRef.notifyIcon1 != null)
        {
            staticRef.notifyIcon1.BalloonTipText = newText;
            staticRef.notifyIcon1.ShowBalloonTip(timeInMillis);
        }
    }
    // Rest of public and private methods
}

其他需要注意的事项:

一个。 Form1的实例永远不会超过1个。

湾在尝试使用之前,我总是检查staticRef的值是否为null。

℃。我不能只为设置一个BalloonTip消息来创建Form1的临时本地实例。

d。这个解决方案非常有效,我更有兴趣知道它是否太过于hacky"如果是的话 - 对我的问题有什么更好的解决方法?

即我发现可以在某种程度上回答我的问题(关于静态属性)的最接近的事情是: Is using a static property in a form bad practice knowing that there's only only one instance of the form?

2 个答案:

答案 0 :(得分:0)

你在这里有一种单身模式。

单身人士模式当然有其批评者及其捍卫者(google" singleton anti-pattern")。

这是一种非常方便的方法。

我会推荐像::

这样的方法
  1. 创建一个表示通知图标上的操作的类。
  2. 将该类作为唯一访问staticRef.notifyIcon1的类。
  3. 请将其作为对notifyIcon1的引用,而不是Form1
  4. 拥有一个获取图标控制类的静态方法或属性。
  5. 或者:

    1. 只需要一个返回NotifyIcon对象的静态方法或属性。
    2. 使其成为访问表单静态引用的唯一方法。
    3. 一个优于另一个的优势在于您是想要公开NotifyIcon的完整界面还是提供一组对您的应用程序有意义的操作。

      通过这种方式,您仍在使用单例模式,但在限制访问方式时,全局状态对全局影响较小的事实更直接地与该全局状态的目的相关(图标本身) ),更容易扩展到不同的用途。例如如果你有一天需要有两个图标,你可以将静态方法或属性的方法更改为进行某种查找的方法,并将所有当前调用更改为使用第一个图标的键。同时,实施更改包括完全更改哪个表单可以在一个地方快速完成图标。

答案 1 :(得分:0)

我认为您当前的设计与发送通知的其他类紧密耦合,它也要求您的表单也是单个实例。

您可以通过使用事件经纪人将通知发送给任何感兴趣的各方来解决这个问题。许多框架都有事件代理,我使用的是Prism,但也有其他框架。

您的代码将只知道活动经纪人以及您的课程感兴趣的活动。

public partial class Form1 : Form
{
    private static IEventBroker eventBroker;
    // Other private properties

    public Form1(IEventBroker eventBroker)
    {
        InitializeComponent();
        this.eventBroker = eventBroker;

        this.eventBroker.Register<NotifyBaloonText>(changeNotifyBalloonText);

    }

    public static void changeNotifyBalloonText(NotifyBaloonText args)
    {
        notifyIcon1.BalloonTipText = args.NewText;
        notifyIcon1.ShowBalloonTip(args.TimeInMillis);
    }
    // Rest of public and private methods
}