List<T>
と同様に動作するが、Clear()
が呼び出されたときにそのメモリの割り当てを解除しないで、Size
プロパティをリセットするだけで.NETのList<T>
タイプのクラスを.NETで探しています。メモリを保持する再利用可能なリスト
私の目的はメモリプールでこのクラスを使用することです。そのため、メモリを維持したいが、呼び出し側が標準リストであるかのようにクラスを使用させるが、メモリを再割り当てするのを避ける。
このコードが既に存在する場合は、このコードの最適化、テスト、およびデバッグにかかる時間を節約できることをお知らせください。
public class ReusableList<T>
{
#region Static Properties
private static long InitialCapacity = 1000000;
private static int CapacityIncreaseRate = 10000;
#endregion
#region Properties
public long Size
{
get
{
return this._size;
}
private set
{
this._size = 0;
}
}
private long _size = 0;
private long RealSize
{
get
{
return this._realSize;
}
set
{
this._realSize = value;
}
}
private long _realSize = 0;
private T[] Data
{
set
{
this._data = value;
}
get
{
return this._data;
}
}
private T[] _data = null;
#endregion
#region Operators
public T this[long index]
{
get
{
return this.Data[index];
}
set
{
this.Data[index] = value;
}
}
#endregion
#region Public Methods
public ReusableList()
{
this.Rebuild();
}
public void Add(T item)
{
this.Data[this.Size] = item;
this._size++;
if (this.Size >= this.RealSize)
{
this.IncreaseSizeOfList();
}
}
public void Clear()
{
this.Size = 0;
}
#endregion
#region Private Methods
private void Rebuild()
{
this.Data = null;
this.Data = new T[ReusableList<T>.InitialCapacity];
this.Size = 0;
this.RealSize = ReusableList<T>.InitialCapacity;
}
private void IncreaseSizeOfList()
{
if (this.Size < this.RealSize)
return;
var newData = new T[this.RealSize + ReusableList<T>.CapacityIncreaseRate];
Array.Copy(this.Data, newData, this.RealSize);
this.Data = newData;
this.RealSize += ReusableList<T>.CapacityIncreaseRate;
}
#endregion
}
にデフォルトと設定サイズに配列項目を設定することですか? – jdweng
@jdweng何を思い浮かべましたか? – rhughes
「IList」を必要なセマンティクスで実装してみませんか?具体的なクラスは、特定のメモリ管理に必要なメソッドを持つことができます。 –
casperOne