簡體   English   中英

防止在C#中創建具有靜態實例的類

[英]Prevent a Class having static instances of it created in C#

有沒有辦法防止在C#中創建具有靜態實例的類。 我不認為有,但它可能有用。 例如,只是一些屬性來防止它。

這樣的事情

[NoStaticInstances]
public class MyClass {
}

以便

public static MyClass _myClass;

會導致錯誤嗎?

沒有“靜態實例”這樣的東西 - 只有一個靜態變量,它被賦值。 除非你將類型本身設置為靜態,否則無法阻止聲明特定類型的靜態變量,這將阻止創建任何實例並聲明該類型的任何變量。

想象一下,如果您所需的功能確實存在...您希望以下代碼如何表現?

class Test
{
    static object foo;

    static void Main()
    {
        MyClass bar = new MyClass();
        foo = bar;
    }
}

哪一行會導致錯誤,如果有的話? 如果是作業,請想象一下:

class Test
{
    static object foo;

    static void Main()
    {
        MyClass bar = new MyClass();
        object tmp = bar;
        foo = tmp;
    }
}

簡而言之,我認為您無法阻止靜態變量保存對類實例的引用。 出於興趣,你為什么

你能做的是以下幾點:

public class MyClass
{
    public MyClass()
    {
#if DEBUG // Only run in debug mode, because of performance.
        StackTrace trace = new StackTrace();

        var callingMethod = trace.GetFrames()[1].GetMethod();

        if (callingMethod.IsStatic && 
            callingMethod.Name == ".cctor")
        {
            throw new InvalidOperationException(
                "You naughty boy!");
        }
#endif
    }
}

靜態字段“通常”將由靜態構造函數創建。 上面的代碼所做的是查看調用方法以查看它是否是靜態構造函數,如果是這種情況,則拋出異常。

但請注意,此檢查非常脆弱,智能用戶可以通過將此方法的創建重構為另一種方法來輕松解決此問題。 換句話說,我同意其他所有人都認為沒有好辦法做到這一點。

這樣的限制是沒有意義的。

如果你寫的怎么辦?

static object something = new YourClass();

實際上,沒有支持此功能的語言或編譯器功能。

不,沒有辦法在C#中指定對象引用的范圍或生命周期。

暫無
暫無

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

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