不可变对象列表的设计模式使用

时间:2015-08-11 00:21:39

标签: c# oop design-patterns

假设我有一个Foo类型的对象,在初始化时,它将是immutable。由于这些对象是不可变的,并且我希望能够访问任何这些Foo对象,因此我将这些对象初始化并存储在static classFooHandler)中,其中包含{{1}所有list个对象。

目前,如果某个类想要访问此对象,我会在Foo的列表中为Foo对象提供FooHandler对象的位置索引,并为getter method需要时返回对象本身。这样做的目的是通过不使两个相同的对象在流通中来节省内存(我认为这是浪费)。

C#中是否有更好的方法来引用这些对象(如指针或类似的东西)或完全更好的结构来解决这个问题,因为我觉得给一个不可变的索引对象过于hackish和容易出错?

示例代码:

public class Foo {
    public int A { get; private set; }
    public int B { get; private set; }

    public Foo(int a, int b) {
        A = a;
        B = b;
    }
}

public static class FooHandler {
    private static List<Foo> fooList;

    static FooHandler() {
        fooList = new List<Foo>();

        fooList.Add(new Foo(1, 2));
        fooList.Add(new Foo(3, 4));
    }

    // Assume there is error checking
    public static Foo GetFoo(int index) {
        return fooList[index];
    }
}

public class Bar {
    public int FooID { get; private set; }

    public Bar(int fooID) {
        FooID = fooID;
    }

    public void func() {
        Console.WriteLine(FooHandler.GetFoo(FooID).A);
    }
}

注意:我知道这个例子可能被认为是可变的,只是想在没有太多测试的情况下快速输入内容。

1 个答案:

答案 0 :(得分:3)

C#已经使用引用(大致相当于指针)传递引用类型(用class表示)。

你不需要做任何特别的事情来获得这个并且它会自动发生。直接返回Foo没有浪费。