2011-03-07 172 views
3

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

像這樣

[NoStaticInstances] 
public class MyClass { 
} 

使

public static MyClass _myClass; 

會導致錯誤?

+1

什麼是靜態實例? – smartcaveman 2011-03-07 16:29:38

+0

對不起,我想在考慮後問了一個愚蠢的問題:)我想這種功能真的沒有辦法。 – 2011-03-07 16:35:45

回答

3

你可以做的是:

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 
    } 
} 

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

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

+0

很酷,這是我想要的,謝謝你。無論我的情況是否可以解決,我只是想幫助防止出現錯誤,所以這是理想的。 – 2011-03-07 16:42:47

+0

@Paul:請注意,這很慢,所以你可能要考慮只在調試模式下運行。查看我的更新。 – Steven 2011-03-07 18:15:51

9

有沒有這樣的事情作爲「靜態實例」 - 只有一個靜態變量,它被賦值。並且沒有辦法阻止聲明特定類型的靜態變量,除非您將類型本身設爲靜態,這將防止創建任何實例,並且會聲明任何變量。

想象一下,如果你想要的功能確實存在 ...你會如何期待下面的代碼行爲?

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; 
    } 
} 

總之,我不認爲你將能夠阻止抱着你的類的實例的引用靜態變量。出於興趣,你爲什麼想要

+0

它只是爲了防止在使用登錄助手中犯的錯誤。如果它在靜態Web應用程序中存儲,則會出現問題。我可能需要更改登錄幫助程序,使其可以變爲靜態。 – 2011-03-07 16:24:46

+1

我知道你試圖阻止其他開發者犯錯誤,但要停止?開發人員可以做很多事情都是錯誤的。你最好寫出很好的(xml)文檔來清楚地解釋這一點。編寫FxCop規則也可能是一個不錯的選擇,但這通常相當耗時。 – Steven 2011-03-07 16:32:41

0

不,不可以在C#中指定對象引用的範圍或生命週期。

2

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

如果你寫

static object something = new YourClass(); 
+0

我認爲它不存在。如果確實如此,那麼上面的代碼理想情況下會導致編譯錯誤,就像您嘗試創建抽象類的實例一樣。 – 2011-03-07 16:26:37

+0

@Paul:如果您通過臨時本地進行分配,該怎麼辦? – SLaks 2011-03-07 16:34:52

1

不是真的,有支持此沒有語言或編譯器的功能。

相關問題