ObjectPool.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. public class ObjectPool<T> where T : class
  5. {
  6. private readonly Stack<T> _objects = new Stack<T>();
  7. private readonly Func<T> _objectGenerator;
  8. public ObjectPool(Func<T> objectGenerator)
  9. {
  10. if (objectGenerator == null)
  11. {
  12. throw new ArgumentNullException("objectGenerator");
  13. }
  14. _objectGenerator = objectGenerator;
  15. }
  16. public T Get()
  17. {
  18. lock (_objects)
  19. {
  20. if (_objects.Count > 0)
  21. {
  22. return _objects.Pop();
  23. }
  24. }
  25. return _objectGenerator();
  26. }
  27. public void Put(T item)
  28. {
  29. lock (_objects)
  30. {
  31. _objects.Push(item);
  32. }
  33. }
  34. public override string ToString()
  35. {
  36. lock (_objects)
  37. {
  38. StringBuilder sb = new StringBuilder();
  39. foreach (T o in _objects)
  40. {
  41. sb.Append(o.ToString()).Append('\n');
  42. }
  43. return sb.ToString();
  44. }
  45. }
  46. }