静态类中的私有静态成员......好主意?

时间:2014-11-03 02:08:16

标签: c# static

我创建了一个静态类,其中包含一个私有静态成员。我的所有静态类方法都可以访问该私有静态成员。

这发生在我没有真正关注的时候,但后来我意识到我做了什么,而且 - 有趣的是 - 它似乎在我的应用程序中正常工作。尽管如此,这似乎是一件愚蠢的事情(来自C ++),所以我一直在寻找更多信息,以确定这是否真的应该是可能的和/或是否被视为好的或坏的做法,但我实际上还没有找到任何关于在C#中的静态类中创建私有静态成员的内容。

我的静态类中的静态方法似乎有一个隐含的“this”变量(因为我也可以调用其他方法而不用类名完全限定它们),这对我来说是一种特殊的感觉。 / p>

我希望你们中的一些人可能对这是否是一个好主意有所了解,以及为什么C#使这一切成为可能。

班级:

public static class ControlHighlighter
{
    private static Panel highlightPanel = null;

    public static void Highlight(Control control = null, int thickness = 1)
    {
        RemoveHighlight();

        if (control != null)
        {
            if (control.Parent != null)
            {
                highlightPanel = new Panel();
                control.Parent.Controls.Add(highlightPanel);
                highlightPanel.Location = new Point(control.Location.X - thickness,
                                                    control.Location.Y - thickness);
                highlightPanel.Size = new Size(control.Size.Width + (2 * thickness),
                                               control.Size.Height + (2 * thickness));
                highlightPanel.SendToBack();
                highlightPanel.BackColor = SystemColors.Highlight;
            }
        }
    }

    public static void RemoveHighlight()
    {
        if (highlightPanel != null)
        {
            highlightPanel.Dispose();
            highlightPanel = null;
        }
    }
}

2 个答案:

答案 0 :(得分:6)

通常,在静态类(甚至非静态类)中使用私有静态成员没有任何问题。但是,它们确实会带来一些潜在的问题:当您的应用程序是多线程的时,这些静态成员将在所有线程中共享,因此您必须在它们周围应用锁定。

由于您永远不知道是否需要使应用程序成为多线程,因此最好将静态变量的数量保持在最小 - 线程之间共享的所有静态变量必须通过锁或其他同步原语进行保护。提前做这种工作要比以后修补问题容易得多。

但是,在您的具体示例中,您将UI控件放在静态变量中 - 这是我绝对建议的。 UI控件存在于UI线程上,并且必须在从其他线程调用时正确调用。抛开线程问题,将控件置于静态变量是一个麻烦的方法 - 静态变量需要仔细清理 - 如果托管控件的表单消失,静态引用仍然会将其保留在内存中(因为控件不能走开)。这可能导致各种难以发现的问题。

如果您对C#中的static不熟悉,建议您阅读MSDN了解更多详情。

答案 1 :(得分:3)

  

我的静态类中的静态方法似乎有一个隐含的“this”变量

正确。无法实例化static类。因为没有实例变量,所以可以使用类名本身访问static类的成员。如果您在static类的范围内,则访问其中的static成员不需要在其前面添加实例变量(this)。

  

我希望你们中的一些人可能对这是否是一个好主意有一些想法

真的..唯一的问题是在多线程环境中。由于此类及其数据将跨线程共享(单个实例..),因此您需要围绕其访问进行同步。通常,static类应该避免因为这个原因而保持状态。