我创建了一个静态类,其中包含一个私有静态成员.我的所有静态类方法都可以访问该私有静态成员.
这发生在我没有真正关注的时候,但后来我意识到我做了什么,而且 - 有趣的是 - 它似乎在我的应用程序中正常工作.尽管如此,这似乎是一件愚蠢的事情(来自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)
通常,在静态类(甚至非静态类)中使用私有静态成员没有任何问题.但是,它们确实会带来一些潜在的问题:当您的应用程序是多线程的时,这些静态成员将在所有线程中共享,因此您必须在它们周围应用锁定.
由于您永远不知道是否需要使应用程序成为多线程,因此最好将静态变量的数量保持在最小 - 线程之间共享的所有静态变量必须通过锁或其他同步原语进行保护.提前完成这类工作要比以后修补问题容易得多.
但是,在您的具体示例中,您将UI控件放在静态变量中 - 这是我绝对建议的.UI控件存在于UI线程上,并且必须在从其他线程调用时正确调用.抛开线程问题,将控件置于静态变量是一个麻烦的方法 - 静态变量需要仔细清理 - 如果托管控件的表单消失,静态引用仍然会将其保留在内存中(因为控件不能走开).这可能导致各种难以发现的问题.
如果您不熟悉staticC#,我建议您阅读MSDN以获取更多详细信息.