Please enable Javascript to view the contents

C# 对象池模式

 ·  ☕ 2 分钟  ·  ✍️ YSL

C# 对象池模式是一种设计模式,用于提高对象的创建和销毁效率。在该模式中,对象池是一个包含一定数量的预先创建的对象集合,这些对象可以被重复使用,而不需要频繁地创建和销毁。使用对象池可以避免频繁的对象分配和垃圾回收,从而提高程序的性能和效率。

在C#中,可以使用泛型类和线程安全的集合类来实现对象池。下面是一个示例代码,展示了如何使用对象池模式在C#中实现对象池:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ObjectPool<T> where T : new()
{
    private ConcurrentBag<T> objects = new ConcurrentBag<T>();
    private Func<T> objectGenerator;

    public ObjectPool(Func<T> objectGenerator)
    {
        this.objectGenerator = objectGenerator;
    }

    public T GetObject()
    {
        T item;
        if (objects.TryTake(out item))
        {
            return item;
        }
        else
        {
            return objectGenerator();
        }
    }

    public void PutObject(T item)
    {
        objects.Add(item);
    }
}

在上面的代码中,定义了一个泛型类ObjectPool,其中T是要池化的对象类型。ObjectPool类包含一个ConcurrentBag类型的成员变量objects,它用于存储可重用的对象。ObjectPool类还包含一个Func类型的成员变量objectGenerator,它用于生成新的对象。

GetObject方法从对象池中获取一个可重用的对象。如果对象池中存在可重用的对象,则直接返回;否则,使用objectGenerator()方法创建一个新的对象。PutObject方法将一个对象放回对象池中,使其可重用。

下面是一个示例代码,展示了如何使用ObjectPool类在C#中实现对象池模式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MyObject
{
    public int Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var objectPool = new ObjectPool<MyObject>(() => new MyObject());

        // 从对象池中获取对象
        var obj1 = objectPool.GetObject();
        obj1.Value = 1;

        var obj2 = objectPool.GetObject();
        obj2.Value = 2;

        // 将对象放回对象池中
        objectPool.PutObject(obj1);
        objectPool.PutObject(obj2);

        // 重新获取对象,应该是从对象池中获取
        var obj3 = objectPool.GetObject();
        Console.WriteLine(obj3.Value);

        var obj4 = objectPool.GetObject();
        Console.WriteLine(obj4.Value);
    }
}

在上面的代码中,定义了一个MyObject类,它包含一个Value属性。然后创建了一个ObjectPool对象,用于池化MyObject类型的对象。在Main方法中,从对象池中获取两个对象,设置它们的Value属性,并将它们放回对象池中。然后再次从对象池中获取两个对象,验证它们的Value属性是否正确。

这就展示了如何使用对象池模式在C#中实现对象池。使用对象池可以避免频繁的对象分配和垃圾回收,从而提高程序的性能和效率。