有沒有辦法阻止在C#中創建靜態實例的類。我認爲沒有,但它可能有用。例如只是一些屬性來防止它。防止在C#中創建具有靜態實例的類
像這樣
[NoStaticInstances]
public class MyClass {
}
使
public static MyClass _myClass;
會導致錯誤?
有沒有辦法阻止在C#中創建靜態實例的類。我認爲沒有,但它可能有用。例如只是一些屬性來防止它。防止在C#中創建具有靜態實例的類
像這樣
[NoStaticInstances]
public class MyClass {
}
使
public static MyClass _myClass;
會導致錯誤?
你可以做的是:
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
}
}
靜態字段將「常」被靜態構造函數來創建。上面的代碼所做的是查看調用方法以查看它是否是靜態構造函數,如果是這種情況,則拋出異常。
但是請注意,此檢查非常脆弱,智能用戶可以通過將此方法的創建重構爲其他方法輕鬆解決此問題。換句話說,我同意所有其他人認爲沒有好的辦法來做到這一點。
很酷,這是我想要的,謝謝你。無論我的情況是否可以解決,我只是想幫助防止出現錯誤,所以這是理想的。 – 2011-03-07 16:42:47
@Paul:請注意,這很慢,所以你可能要考慮只在調試模式下運行。查看我的更新。 – Steven 2011-03-07 18:15:51
有沒有這樣的事情作爲「靜態實例」 - 只有一個靜態變量,它被賦值。並且沒有辦法阻止聲明特定類型的靜態變量,除非您將類型本身設爲靜態,這將防止創建任何實例,並且會聲明任何變量。
想象一下,如果你想要的功能確實存在 ...你會如何期待下面的代碼行爲?
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;
}
}
總之,我不認爲你將能夠阻止抱着你的類的實例的引用靜態變量。出於興趣,你爲什麼想要?
它只是爲了防止在使用登錄助手中犯的錯誤。如果它在靜態Web應用程序中存儲,則會出現問題。我可能需要更改登錄幫助程序,使其可以變爲靜態。 – 2011-03-07 16:24:46
我知道你試圖阻止其他開發者犯錯誤,但要停止?開發人員可以做很多事情都是錯誤的。你最好寫出很好的(xml)文檔來清楚地解釋這一點。編寫FxCop規則也可能是一個不錯的選擇,但這通常相當耗時。 – Steven 2011-03-07 16:32:41
不,不可以在C#中指定對象引用的範圍或生命週期。
這樣的限制是沒有意義的。
如果你寫
static object something = new YourClass();
我認爲它不存在。如果確實如此,那麼上面的代碼理想情況下會導致編譯錯誤,就像您嘗試創建抽象類的實例一樣。 – 2011-03-07 16:26:37
@Paul:如果您通過臨時本地進行分配,該怎麼辦? – SLaks 2011-03-07 16:34:52
不是真的,有支持此沒有語言或編譯器的功能。
什麼是靜態實例? – smartcaveman 2011-03-07 16:29:38
對不起,我想在考慮後問了一個愚蠢的問題:)我想這種功能真的沒有辦法。 – 2011-03-07 16:35:45