带对象的全局静态类

时间:2010-08-03 19:10:46

标签: c# oop static

好的,所以我知道你不能在静态类中拥有对象,但我需要一个可以容纳可从不同类访问的对象的类。我正在制作一个dll,它将为另一个程序提供扩展功能,所以我不能只是继承或传递类。如果需要,我可以只是使每个对象的属性我需要在静态类,这将工作,但不是我想要的友好。谁有关于如何完成这样的事情的任何其他想法?

2 个答案:

答案 0 :(得分:12)

实际上,你可以在静态类中拥有对象 - 它们只需要是静态对象。

例如:

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

从程序的其他地方,您可以调用实例方法/属性/等:

SharedObjects.GetObj().MyInstanceMethod();

答案 1 :(得分: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()),因为您可以随时更改实现,包括使(某些)字段非静态。 显示在共享数据时会成为常规类。