CA1039:清單為強類型
型別名稱 |
ListsAreStronglyTyped |
CheckId |
CA1039 |
分類 |
Microsoft.Design |
中斷變更 |
中斷 |
原因
公用或保護的型別會實作 IList,但不會針對下列的一或多個項目提供強型別方法:
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
規則描述
這項規則要求 IList 實作提供強型別成員,讓使用者在使用介面所提供的功能時,不需將引數轉換為 Object 型別。IList 介面是由可透過索引存取的物件集合所實作。這項規則假設實作 IList 的型別的確會這樣做,以管理比 Object 還強之型別的執行個體 (Instance) 集合。
IList 會實作 ICollection 和 IEnumerable 介面。若要實作 IList,您必須針對 ICollection 提供必要的強型別成員。如果集合中的物件會擴充 ValueType,則您必須針對 GetEnumerator 提供強型別成員,以避免因 Boxing 而導致效能降低,但當集合的物件是參考型別 (Reference Type) 時,則不需如此。
若要遵守這項規則,請使用 InterfaceName.InterfaceMemberName 格式的名稱,明確地實作介面成員,如 Add。明確介面成員會使用介面所宣告的資料型別。使用介面成員名稱實作強型別成員,如 Add。將強型別成員宣告為公用,並將參數和傳回值宣告為集合所管理的強型別。強型別會取代較弱式型別,例如介面所宣告的 Object 和 Array。
如何修正違規
若要修正此規則的違規情形,請明確地實作 IList 成員,並提供強型別成員取代先前所提到的成員。如需正確實作 IList 介面並提供必要強型別成員的程式碼,請參閱下列範例。
隱藏警告的時機
在實作新的物件架構集合 (如連結串列 (Linked List)),且其中擴充新集合的型別會判斷強型別時,請隱藏這項規則的警告。這些型別應該遵守這項規則並公開 (Expose) 強型別成員。
範例
在下列範例中,型別 YourType 會擴充 CollectionBase,如同所有強型別集合所應該做的一般。請注意,CollectionBase 會為您提供 IList 介面的明確實作。因此,您只能 IList 及 ICollection 的強型別成員。
using System;
using System.Collections;
namespace DesignLibrary
{
public class YourType
{
// Implementation for your strong type goes here.
public YourType() {}
}
public class YourTypeCollection : CollectionBase
{
// Provide the strongly typed members for IList.
public YourType this[int index]
{
get
{
return (YourType) ((IList)this)[index];
}
set
{
((IList)this)[index] = value;
}
}
public int Add(YourType value)
{
return ((IList)this).Add ((object) value);
}
public bool Contains(YourType value)
{
return ((IList)this).Contains((object) value);
}
public void Insert(int index, YourType value)
{
((IList)this).Insert(index, (object) value);
}
public void Remove(YourType value)
{
((IList)this).Remove((object) value);
}
public int IndexOf(YourType value)
{
return ((IList)this).IndexOf((object) value);
}
// Provide the strongly typed member for ICollection.
public void CopyTo(YourType[] array, int index)
{
((ICollection)this).CopyTo(array, index);
}
}
}