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

jra*_*amm 0 c# static

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

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

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

我希望你们中的一些人可能对这是否是一个好主意有一些想法,以及为什么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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

xxb*_*bcc 6

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

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

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

如果您不熟悉staticC#,我建议您阅读MSDN以获取更多详细信息.