Événement
Créer des applications intelligentes
17 mars, 21 h - 21 mars, 10 h
Rejoignez la série de rencontres pour créer des solutions IA évolutives basées sur des cas d’usage réels avec d’autres développeurs et experts.
S’inscrire maintenantCe navigateur n’est plus pris en charge.
Effectuez une mise à niveau vers Microsoft Edge pour tirer parti des dernières fonctionnalités, des mises à jour de sécurité et du support technique.
Propriété | Value |
---|---|
Identificateur de la règle | CA1010 |
Titre | Les collections doivent implémenter une interface générique |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Sans rupture |
Activée par défaut dans .NET 9 | Non |
Un type implémente l’interface System.Collections.IEnumerable, mais n’implémente pas l’interface System.Collections.Generic.IEnumerable<T>, et l’assembly contenant cible .NET. Cette règle ignore les types qui implémentent System.Collections.IDictionary.
Par défaut, cette règle examine uniquement les types visibles en externe, mais elle est configurable. Vous pouvez également configurer des interfaces supplémentaires pour exiger l’implémentation d’une interface générique.
Pour étendre la facilité d’utilisation d’une collection, implémentez l’une des interfaces de collection génériques. Ensuite, la collection peut être utilisée pour remplir des types de collection génériques, comme suit :
Pour corriger une violation de cette règle, implémentez l’une des interfaces de collection génériques suivantes :
Il est sûr de supprimer un avertissement de cette règle; toutefois, l’utilisation de la collection sera plus limitée.
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1010
// The code that's violating the rule is on this line.
#pragma warning restore CA1010
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1010.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.
Vous pouvez configurer ces options seulement pour cette règle, ou bien pour toutes les règles auxquelles elles s’appliquent, ou encore pour toutes les règles de cette catégorie (Conception) auxquelles elles s’appliquent. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.
Vous pouvez configurer les parties de votre codebase sur lesquelles exécuter cette règle, en fonction de leur accessibilité, en définissant l’option api_surface. Par exemple, pour spécifier que la règle doit s’exécuter uniquement sur la surface d’API non publique, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :
dotnet_code_quality.CAXXXX.api_surface = private, internal
Note
Remplacez la partie XXXX
de CAXXXX
par l’ID de la règle applicable.
Vous pouvez configurer la liste des noms d’interface (séparés par |
) avec leur interface complète générique requise (séparée par ->
).
Formats d’interface autorisés :
T:
facultatif.Exemples :
Valeur d'option | Récapitulatif |
---|---|
dotnet_code_quality.CA1010.additional_required_generic_interfaces = ISomething->System.Collections.Generic.IEnumerable`1 |
Tous les types qui implémentent ISomething indépendamment de son espace de noms doivent également implémenter System.Collections.Generic.IEnumerable<T>. |
dotnet_code_quality.CA1010.additional_required_generic_interfaces = T:System.Collections.IDictionary->T:System.Collections.Generic.IDictionary`2 |
Tous les types qui implémentent System.Collections.IDictionary sont censés également implémenter System.Collections.Generic.IDictionary<TKey,TValue>. |
L’exemple suivant montre une classe qui dérive de la classe non générique CollectionBase
et enfreint cette règle.
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);
}
}
Pour corriger une infraction à cette règle, effectuez l’une des opérations suivantes :
Collection<T>
.L’exemple suivant corrige la violation en implémentant ces interfaces génériques : IEnumerable<T>, ICollection<T> et 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()
{
}
}
}
L’exemple suivant corrige la violation en changeant la classe de base de la collection de la classe non générique CollectionBase
en classe générique Collection<T>
(Collection(Of T)
en Visual Basic).
public class Book
{
public Book()
{
}
}
public class BookCollection : Collection<Book>
{
public BookCollection()
{
}
}
La modification de la classe de base d’une classe déjà publiée est considérée comme un changement cassant pour les consommateurs existants.
Commentaires sur .NET
.NET est un projet open source. Sélectionnez un lien pour fournir des commentaires:
Événement
Créer des applications intelligentes
17 mars, 21 h - 21 mars, 10 h
Rejoignez la série de rencontres pour créer des solutions IA évolutives basées sur des cas d’usage réels avec d’autres développeurs et experts.
S’inscrire maintenant