CA1010: A gyűjteményeknek általános felületet kell implementálniuk
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1010 |
Cím | A gyűjteményeknek általános felületet kell implementálniuk |
Kategória | Design |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
Egy típus implementálja az System.Collections.IEnumerable interfészt, de nem implementálja az System.Collections.Generic.IEnumerable<T> interfészt, és az azt tartalmazó szerelvény a .NET-et célozza meg. Ez a szabály figyelmen kívül hagyja a megvalósító System.Collections.IDictionarytípusokat.
Ez a szabály alapértelmezés szerint csak külsőleg látható típusokat tekint meg, de ez konfigurálható. További adaptereket is konfigurálhat, hogy általános felületet kelljen implementálnia.
Szabály leírása
A gyűjtemények használhatóságának bővítése érdekében implementálja az egyik általános gyűjteményi felületet. Ezután a gyűjtemény használható általános gyűjteménytípusok, például a következők feltöltésére:
- System.Collections.Generic.List<T>
- System.Collections.Generic.Queue<T>
- System.Collections.Generic.Stack<T>
Szabálysértések kijavítása
A szabály megsértésének kijavításához hajtsa végre az alábbi általános gyűjteményfelületek egyikét:
- System.Collections.Generic.IEnumerable<T>
- System.Collections.Generic.ICollection<T>
- System.Collections.Generic.IList<T>
Mikor kell letiltani a figyelmeztetéseket?
A szabályból származó figyelmeztetéseket nyugodtan el lehet tiltani; azonban a gyűjtemény használata korlátozottabb lesz.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1010
// The code that's violating the rule is on this line.
#pragma warning restore CA1010
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1010.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítások segítségével konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Tervezés) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
További szükséges általános felületek
Konfigurálhatja a felületnevek listáját (elválasztva ) |
a szükséges általános, teljes mértékben minősített felülettel (elválasztva).->
Engedélyezett felületformátumok:
- Csak a felület neve (a nevet tartalmazó típustól vagy névtértől függetlenül) tartalmazza az összes illesztőt.
- A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek opcionális
T:
előtaggal.
Examples:
Beállítás értéke | Összesítés |
---|---|
dotnet_code_quality.CA1010.additional_required_generic_interfaces = ISomething->System.Collections.Generic.IEnumerable`1 |
A névtértől függetlenül implementálandó ISomething összes típus várhatóan implementálni System.Collections.Generic.IEnumerable<T>is fog. |
dotnet_code_quality.CA1010.additional_required_generic_interfaces = T:System.Collections.IDictionary->T:System.Collections.Generic.IDictionary`2 |
Minden implementálási System.Collections.IDictionary típust várhatóan a rendszer is implementálni fog System.Collections.Generic.IDictionary<TKey,TValue>. |
Példa
Az alábbi példa egy olyan osztályt mutat be, amely a nem általános CollectionBase
osztályból származik, és megsérti ezt a szabályt.
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase
{
public BookCollection()
{
}
public void Add(Book value)
{
InnerList.Add(value);
}
public void Remove(Book value)
{
InnerList.Remove(value);
}
public void Insert(int index, Book value)
{
InnerList.Insert(index, value);
}
public Book? this[int index]
{
get { return (Book?)InnerList[index]; }
set { InnerList[index] = value; }
}
public bool Contains(Book value)
{
return InnerList.Contains(value);
}
public int IndexOf(Book value)
{
return InnerList.IndexOf(value);
}
public void CopyTo(Book[] array, int arrayIndex)
{
InnerList.CopyTo(array, arrayIndex);
}
}
A szabály megsértésének kijavításához tegye az alábbiak egyikét:
- Implementálja az általános felületet.
- Módosítsa az alaposztályt olyan típusra, amely már implementálja az általános és a nem általános interfészeket is, például az osztályt
Collection<T>
.
Javítás felületi implementáció alapján
Az alábbi példa az alábbi általános felületek implementálásával oldja meg a szabálysértést: IEnumerable<T>, ICollection<T>és IList<T>.
public class Book
{
public Book()
{
}
}
public class BookCollection : CollectionBase, IList<Book?>
{
public BookCollection()
{
}
int IList<Book?>.IndexOf(Book? item)
{
return this.List.IndexOf(item);
}
void IList<Book?>.Insert(int location, Book? item)
{
}
Book? IList<Book?>.this[int index]
{
get => (Book?)this.List[index];
set { }
}
void ICollection<Book?>.Add(Book? item)
{
}
bool ICollection<Book?>.Contains(Book? item)
{
return true;
}
void ICollection<Book?>.CopyTo(Book?[] array, int arrayIndex)
{
}
bool ICollection<Book?>.IsReadOnly
{
get { return false; }
}
bool ICollection<Book?>.Remove(Book? item)
{
if (InnerList.Contains(item))
{
InnerList.Remove(item);
return true;
}
return false;
}
IEnumerator<Book> IEnumerable<Book?>.GetEnumerator()
{
return new BookCollectionEnumerator(InnerList.GetEnumerator());
}
private class BookCollectionEnumerator : IEnumerator<Book>
{
private IEnumerator _Enumerator;
public BookCollectionEnumerator(IEnumerator enumerator)
{
_Enumerator = enumerator;
}
public Book Current
{
get { return (Book)_Enumerator.Current; }
}
object IEnumerator.Current
{
get { return _Enumerator.Current; }
}
public bool MoveNext()
{
return _Enumerator.MoveNext();
}
public void Reset()
{
_Enumerator.Reset();
}
public void Dispose()
{
}
}
}
Javítás alaposztály-módosítás szerint
Az alábbi példa úgy oldja meg a szabálysértést, hogy a gyűjtemény alaposztályát a nem általános CollectionBase
osztályról az általános Collection<T>
(Collection(Of T)
Visual Basic) osztályra módosítja.
public class Book
{
public Book()
{
}
}
public class BookCollection : Collection<Book>
{
public BookCollection()
{
}
}
A már kiadott osztály alaposztályának módosítása a meglévő felhasználókra vonatkozó kompatibilitástörő változásnak számít.
Kapcsolódó szabályok
- CA1005: Az általános típusok túlzott paramétereinek elkerülése
- CA1000: Ne deklarálja a statikus tagokat általános típusok esetében
- CA1002: Ne tegye közzé az általános listákat
- CA1003: Általános eseménykezelő példányok használata
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: