簡體   English   中英

如何在c#中返回一個靜態類實例

[英]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永遠不會有效
  • Singleton類不能是靜態類
  • 單身人士聲明一個靜態成員,以幫助確保只存在該類的單個實例
  • 請注意,對對象的靜態引用不會使對象成為靜態。 只有參考是靜態的

進一步閱讀: 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.

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