Megosztás a következőn keresztül:


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:

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:

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:

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ó információk