[英]How to return a static class instance in c#
我想得到一個靜態類的實例,但是如果沒有在非靜態類上實現單例包裝,我似乎無法做到這一點 - 這是可能的,還是我錯過了什么?
public class MyInstanceTester
{
public MyInstanceTester()
{
//this is how i get a reference to a singleton now
MyClass instance1 = MyClass.Instance();
//this is what is would like to do (if only the compiler would let me)
MyStaticClass instance2 = MyStaticClass.Instance();
}
}
public class MyClass
{
private static MyClass _myInstance;
static MyClass()
{
_myInstance = new MyClass();
}
public static MyClass Instance()
{
return _myInstance;
}
}
public static class MyStaticClass
{
public static MyStaticClass Instance
{
get
{
return this;
}
}
}
沒有靜態類的實例。 單例模式只是將類的同一實例返回給重復的請求。
你可能會感到困惑:
private static MyClass _myInstance;
這僅僅意味着在具有_myInstance作為成員的類型實例化的所有對象中將存在該特定對象的單個實例。
幾點說明:
this
關鍵字在靜態成員中無效 this
永遠不會有效 進一步閱讀: Jon Skeet非常出色地介紹了在C#In Depth中實現Singletons 。 我建議閱讀和研究這篇文章,直到你理解它為止。 這是非常好的。
沒有理由將instance to a static class
返回instance to a static class
(如果類是靜態的,則沒有實例)。
您可以從任何地方訪問該類,為什么要將instance
返回給它? 我無法想象有任何理由這樣做。
要使用靜態類,只需按如下所示編寫:
MyStaticClass.MyMethod();
Int32 callCount = MyStaticClass.CallCount;
正如您所看到的,聲明變量甚至沒有意義,因為這看起來像這樣:
MyStaticClass msc = MyStaticClass.Instance();
msc.MyMethod();
Int32 callCount = msc.CallCount;
如果你想要一個較短的名字,你可以使用:
using MSC = MyNamespace.MyStaticClass;
根據您的評論,我認為您的解決方案是:
讓你的班級非靜態。 (只是保持方法靜態。)
你的術語是錯的。 請閱讀有關static關鍵字的MSDN文章 。
無法通過實例引用靜態成員。 相反,它通過類型名稱引用。
單例是一個只允許自身的單個實例的類。 C#中常見的一點是:
public class MyClass
{
private MyClass _value = null;
public MyClass Value {
get { return _value ?? (_value = new MyClass()); }
}
}
主要問題在於:
public static class MyStaticClass
{
public static MyStaticClass Instance
{
get
{
return this; //compile time error!
}
}
}
this
指的是一個在靜態類中沒有意義的類的實例,因為沒有一個實例。 這本身就應該讓你意識到你所問的問題存在一個根本性的錯誤:“我想得到一個靜態類的實例”。 您不能將靜態類的實例作為靜態類返回,因為定義無法實例化。
單例模式只是確保您始終返回同一個類的實例。 但是所說的課程永遠不會是靜止的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.