簡體   English   中英

靜態類中的私有靜態成員...好主意嗎?

[英]Private Static Members inside a Static Class… Good idea?

我創建了一個帶有私有靜態成員的靜態類。 我所有的靜態類方法都可以訪問該私有靜態成員。

發生這種情況的時候我並沒有真正注意,但是后來我意識到自己做了什么,而且-有趣的是-它似乎在我的應用程序中運行良好。 盡管如此,這似乎是一件很愚蠢的事情(來自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;
        }
    }
}

通常,在靜態類(甚至在非靜態類)中擁有私有靜態成員沒有錯。 但是,它們確實存在一些潛在的問題:當您的應用程序是多線程時,這些靜態成員在所有線程之間共享,因此您必須在它們周圍應用鎖定。

由於您永遠不知道是否需要使應用程序成為多線程,因此最好將靜態變量的數量保持在最低限度-線程之間共享的所有靜態變量必須通過鎖或其他同步原語進行保護。 與以后修補問題相比,提前進行此類工作要容易得多。

但是,在您的特定示例中,您將UI控件放在靜態變量中-我絕對不建議這樣做。 UI控件位於UI線程上,並且從其他線程調用時必須正確調用。 除了線程問題外,將控件放在靜態變量中是麻煩的根源-靜態變量需要仔細的布爾值清理才能清除-如果托管控件的表單消失了,靜態引用仍將其保留在內存中(因為控件無法走開)。 這可能會導致各種難以發現的問題。

如果您不熟悉C#中的static ,建議閱讀MSDN以獲取更多詳細信息。

似乎我的靜態類中的靜態方法具有隱式的“ this”變量

正確。 static類無法實例化。 因為沒有實例變量,所以您可以使用類名本身來訪問static類的成員。 當您處於static類的范圍內時,訪問其中的static成員不需要在其前面加上實例變量( this )。

我希望你們中的一些人對這是否一個好主意有一些想法

真的..唯一的問題是在多線程環境中。 由於此類及其數據將在線程(單個實例..)之間共享,因此您需要圍繞其訪問進行同步。 通常,出於這個原因, static類應避免維護狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM