2010-08-03 71 views
4

好吧,所以我知道你不能在一個靜態類中的對象,但我需要一個類,我可以容納可從不同類訪問的對象。我正在製作一個dll,它將爲另一個程序提供擴展功能,所以我不能僅僅繼承或傳遞類。如果需要的話,我可能只是可能使每個對象的屬性,我需要在靜態類,這將工作,但沒有像我想的那樣友好。任何人有任何其他想法如何完成這樣的事情?全局靜態類與對象

+3

您是否考慮過依賴注入和/或託管擴展性框架? – Robaticus 2010-08-03 19:11:56

+0

你說第一句話的原因是什麼? – 2012-04-05 23:05:16

+0

它實際上被命名爲Singleton模式。 – 2015-07-17 07:09:08

回答

12

實際上,您可以讓對象處於靜態類 - 它們只需要是靜態對象。

例如:

public static class SharedObjects 
{ 
    private static MyClass obj = new MyClass(); 
    public static MyClass GetObj() 
    { 
     return obj; 
    } 
} 

並從程序的其它地方,你可以調用實例方法/屬性/等:

SharedObjects.GetObj().MyInstanceMethod(); 
+0

以及我沒有嘗試,但我得到這個錯誤,是什麼把我帶到這裏: 所以這就是爲什麼我認爲你不能在你的靜態類 錯誤可訪問性不一致的對象:返回類型「myNameSpace對象。 MyClass'比方法'MyNameSpace.StaticClass.GetObj()' – cferbs 2010-08-03 19:28:39

+3

更方便。在這種情況下,檢查MyClass的訪問修飾符。它需要公開而不是私人或內部。 – Manfred 2010-08-03 19:31:57

+0

@cferbs正如Manfred所說的,確保'MyClass'被聲明爲'public class MyClass'。 – Justin 2010-08-03 19:32:24

0

一種選擇是有一個與存取方法訪問類一個靜態對象(或多個對象)。系統的其他部分可以使用該類作爲靜態或非靜態。這裏是代碼:

public class GlobalInformation { 
    public static GlobalInformation CreateInstance() { 
     // Factory method through GlobalInformmation.CreateInstance() 
     return new GlobalInformation(); 
    } 

    public GlobalInformation() { 
     // Regular use through new GlobalInformation() 
    } 

    static GlobalInformation() { 
     // Static initializer called once before class is used. 
     // e.g. initialize values: 
     _aString = "The string value"; 
    } 

    public string AccessAString { 
     get { 
      return _aString; 
     } 
    } 

    public Foo AccessAnObject() { 
     return _anObject; 
    } 

    private static string _aString; 
    private static readonly Foo _anObject = new Foo(); 
    } 

您的系統的其他部分將使用它如下。選項1:

var globalInfo = GlobalInformation.CreateInstance(); 
var aString = globalInfo.AssessAString; 
var anObj = globalInfo.AccessAnObject(); 

選項2:

var globalInfo = new GlobalInformation(); 
var aString = globalInfo.AssessAString; 
var anObj = globalInfo.AccessAnObject(); 

選項2將是我的首選一個(我會刪除靜態工廠方法CreateInstance()),你可以隨時更改的實施,包括使(一些)字段是非靜態的。它會出現是一個普通的班級,同時共享數據。