diff --git a/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs b/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs index 623ae31..1590081 100644 --- a/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs +++ b/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs @@ -38,10 +38,15 @@ namespace CodeProject.ObjectPool.Core public sealed class PooledObjectBuffer where T : PooledObject { + /// + /// Used as default value for . + /// + private static readonly T[] NoObjects = new T[0]; + /// /// The concurrent buffer containing pooled objects. /// - private T[] _pooledObjects; + private T[] _pooledObjects = NoObjects; public int Capacity => _pooledObjects.Length; @@ -107,24 +112,24 @@ public bool TryEnqueue(T pooledObject) return false; } - public void ResizeBuffer(int newSize) + public void Resize(int newCapacity) { - if (_pooledObjects == null) + if (_pooledObjects == NoObjects) { - _pooledObjects = new T[newSize]; + _pooledObjects = new T[newCapacity]; return; } - var currentSize = _pooledObjects.Length; - if (currentSize == newSize) + var currentCapacity = _pooledObjects.Length; + if (currentCapacity == newCapacity) { // Nothing to do. return; } - if (currentSize > newSize) + if (currentCapacity > newCapacity) { - for (var i = newSize; i < currentSize; ++i) + for (var i = newCapacity; i < currentCapacity; ++i) { ref var item = ref _pooledObjects[i]; if (item != null) @@ -135,7 +140,7 @@ public void ResizeBuffer(int newSize) } } - Array.Resize(ref _pooledObjects, newSize); + Array.Resize(ref _pooledObjects, newCapacity); } } } \ No newline at end of file diff --git a/src/CodeProject.ObjectPool/ObjectPool.cs b/src/CodeProject.ObjectPool/ObjectPool.cs index c07a8ef..24061ff 100644 --- a/src/CodeProject.ObjectPool/ObjectPool.cs +++ b/src/CodeProject.ObjectPool/ObjectPool.cs @@ -66,7 +66,7 @@ public int MaximumPoolSize // Preconditions Raise.ArgumentOutOfRangeException.If(value < 1, nameof(value), ErrorMessages.NegativeOrZeroMaximumPoolSize); - _pooledObjects.ResizeBuffer(value); + _pooledObjects.Resize(value); } } diff --git a/src/CodeProject.ObjectPool/PooledObject.cs b/src/CodeProject.ObjectPool/PooledObject.cs index f110da6..624ae29 100644 --- a/src/CodeProject.ObjectPool/PooledObject.cs +++ b/src/CodeProject.ObjectPool/PooledObject.cs @@ -9,7 +9,9 @@ */ using CodeProject.ObjectPool.Core; +using PommaLabs.Thrower.Goodies; using System; +using System.Collections.Generic; #if !NET35 @@ -23,7 +25,7 @@ namespace CodeProject.ObjectPool /// PooledObject base class. /// [Serializable] - public abstract class PooledObject : IDisposable + public abstract class PooledObject : EquatableObject, IDisposable { #region Logging @@ -135,13 +137,10 @@ protected virtual void OnReleaseResources() #region Returning object to pool - Dispose and Finalizer -#pragma warning disable CC0029 // Disposables Should Call Suppress Finalize - /// /// See docs. /// public void Dispose() -#pragma warning restore CC0029 // Disposables Should Call Suppress Finalize { // Returning to pool HandleReAddingToPool(false); @@ -186,5 +185,35 @@ private void HandleReAddingToPool(bool reRegisterForFinalization) } #endregion Returning object to pool - Dispose and Finalizer + + #region Formatting and equality + + /// + /// Returns all property (or field) values, along with their names, so that they can be + /// used to produce a meaningful . + /// + /// + /// All property (or field) values, along with their names, so that they can be used to + /// produce a meaningful . + /// + protected override IEnumerable> GetFormattingMembers() + { + yield return new KeyValuePair(nameof(PooledObjectInfo.Id), PooledObjectInfo.Id); + } + + /// + /// Returns all property (or field) values that should be used inside + /// or . + /// + /// + /// All property (or field) values that should be used inside + /// or . + /// + protected override IEnumerable GetIdentifyingMembers() + { + yield return PooledObjectInfo.Id; + } + + #endregion Formatting and equality } } \ No newline at end of file