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