[英]C# - What are the best practices when creating custom lists using arrays
我有一些功課可以練習一些概念,例如泛型,委托和接口。 整個項目是使用T
數組構建自定義列表類。 類也應該實現IEnumerable
,有一個結構是一個IEnumerator
。 我在這里只關注Add方法。
class MyList<T> : IEnumerable
{
private static readonly T[] arrayStarter = new T[1];
private int capacity = 1;
private int currentItems = 1;
public T[] TList { get; set; }
public MyList()
{
TList = arrayStarter;
TList[0] = default(T);
}
public T[] Add(T[] tArray, T item)
{
T[] temp = new T[++capacity];
for (int i = 0; i < tArray.Length; i++)
temp[i] = tArray[i];
temp[tArray.Length] = item;
currentItems++;
return temp;
}
}
當我創建列表的實例時,我想使用以下方法添加項目:
MyList<int> m = new MyList<int>();
m.TList = m.Add(m.TList, 5);
m.TList = m.Add(m.TList, 7);
m.TList = m.Add(m.TList, 13);
m.TList = m.Add(m.TList, 15);
我敢肯定,有一種更好的方法來制作自定義列表,希望在那里的人對此事有深入的了解。
此實現表明,您總體上缺少封裝的要點,尤其是缺少使用私有成員的要點。 由於您使TList
數組成為列表類的成員,因此您可以將其完全向用戶隱藏。 您的用戶應該能夠寫
m.Add(5);
m.Add(7);
代替
m.TList = m.Add(m.TList, 5);
m.TList = m.Add(m.TList, 7);
完全不用擔心m.TList
的存在。
幸運的是,您可以很容易地做到這一點:將TList
私有字段,將其重命名為以小寫字母開頭的名稱 ,以遵循C#的命名准則 ,將其從Add
的參數列表中刪除,然后將Add
更改為不返回任何內容。 這將匹配IList<T>
的簽名,您應該考慮實現該簽名。
完成這項工作后,請考慮從currentItems
“分離” capacity
,讓第一個更快地增長,而另一個隨着更多項目的增加而趕上它。 這將減少重新分配的次數。
最后,請考慮切換到使用Array.Resize<T>
以避免手動復制數據。
如果查看ReferenceSource或ILSpy中List<>
的Add()
方法實現,您將看到以下內容:
private int _size;
private T[] _items;
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}
private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
int num = (this._items.Length != 0) ? (this._items.Length * 2) : 4;
if (num > 2146435071)
{
num = 2146435071;
}
if (num < min)
{
num = min;
}
this.Capacity = num;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.