


L'insertion d'un type valeur dans ArrayList déclenchera une opération de boxing, et la récupération d'un type valeur nécessite un unboxing, comme suit
ArrayList myArrayList = new ArrayList(); myArrayList.Add(40);//装箱 myArrayList.Add(80);//装箱 Int32 a1 = (Int32)myArrayList[0];//拆箱 Int32 a2 = (Int32)myArrayList[1];//拆箱
, ce qui entraînera une consommation de performances. Quant à l’explication détaillée de l’emballage, voir l’article suivant.
Afin de résoudre ces problèmes, C# dispose de l'interface IList
/// <summary> /// 泛型集合类 /// </summary> /// <typeparam name="T"></typeparam> public class List<T> : IList<T>, IList { /// <summary> /// 泛型迭代器 /// </summary> /// <typeparam name="T"></typeparam> public struct Enumertor<T> : IEnumerator, IEnumerator<T> { //迭代索引 private int index; //迭代器所属的集合对象引用 private List<T> list; public Enumertor(List<T> container) { this.list = container; this.index = -1; } public void Dispose() { } /// <summary> /// 显示实现IEnumerator的Current属性 /// </summary> object IEnumerator.Current { get { return list[index]; } } /// <summary> /// 实现IEnumerator<T>的Current属性 /// </summary> public T Current { get { return list[index]; } } /// <summary> /// 迭代器指示到下一个数据位置 /// </summary> /// <returns></returns> public bool MoveNext() { if (this.index < list.Count) { ++this.index; } return this.index < list.Count; } public void Reset() { this.index = -1; } } /// <summary> /// 保存数据的数组,T类型则体现了泛型的作用。 /// </summary> private T[] array; /// <summary> /// 当前集合的长度 /// </summary> private int count; /// <summary> /// 默认构造函数 /// </summary> public List() : this(1) { } public List(int capacity) { if (capacity < 0) { throw new Exception("集合初始长度不能小于0"); } if (capacity == 0) { capacity = 1; } this.array = new T[capacity]; } /// <summary> /// 集合长度 /// </summary> public int Count { get { return this.count; } } /// <summary> /// 集合实际长度 /// </summary> public int Capacity { get { return this.array.Length; } } /// <summary> /// 是否固定大小 /// </summary> public bool IsFixedSize { get { return false; } } /// <summary> /// 是否只读 /// </summary> public bool IsReadOnly { get { return false; } } /// <summary> /// 是否可同属性 /// </summary> public bool IsSynchronized { get { return false; } } /// <summary> /// 同步对象 /// </summary> public object SyncRoot { get { return null; } } /// <summary> /// 长度不够时,重新分配长度足够的数组 /// </summary> /// <returns></returns> private T[] GetNewArray() { return new T[(this.array.Length + 1) * 2]; } /// <summary> /// 实现IList<T>Add方法 /// </summary> /// <param name="value"></param> public void Add(T value) { int newCount = this.count + 1; if (this.array.Length < newCount) { T[] newArray = GetNewArray(); Array.Copy(this.array, newArray, this.count); this.array = newArray; } this.array[this.count] = value; this.count = newCount; } /// <summary> /// 向集合末尾添加对象 /// </summary> /// <param name="value"></param> /// <returns></returns> int IList.Add(object value) { ((IList<T>)this).Add((T)value); return this.count - 1; } /// <summary> /// 实现IList<T>索引器 /// </summary> /// <param name="index"></param> /// <returns></returns> public T this[int index] { get { if (index < 0 || index >= this.count) { throw new ArgumentOutOfRangeException("index"); } return this.array[index]; } set { if (index < 0 || index >= this.count) { throw new ArgumentOutOfRangeException("index"); } this.array[index] = value; } } /// <summary> /// 显示实现IList接口的索引器 /// </summary> /// <param name="index"></param> /// <returns></returns> object IList.this[int index] { get { return ((IList<T>)this)[index]; } set { ((IList<T>)this)[index] = (T)value; } } /// <summary> /// 删除集合中的元素 /// </summary> /// <param name="index"></param> /// <param name="count"></param> public void RemoveRange(int index, int count) { if (index < 0) { throw new ArgumentOutOfRangeException("index"); } int removeIndex = index + count; if (count < 0 || removeIndex > this.count) { throw new ArgumentOutOfRangeException("index"); } Array.Copy(this.array, index + 1, this.array, index + count - 1, this.count - removeIndex); this.count -= count; } /// <summary> /// 实现IList<T>接口的indexOf方法 /// </summary> /// <param name="value"></param> /// <returns></returns> public int IndexOf(T value) { int index = 0; if (value == null) { while (index < this.count) { if (this.array[index] == null) { return index; } ++index; } } else { while (index < this.count) { if (value.Equals(this.array[index])) { return index; } ++index; } } return -1; } /// <summary> /// 显示实现IList接口的IndexOf方法 /// </summary> /// <param name="value"></param> /// <returns></returns> int IList.IndexOf(object value) { return ((IList<T>)this).IndexOf((T)value); } /// <summary> /// 查找对应数组项 /// </summary> /// <param name="o"></param> /// <param name="compar"></param> /// <returns></returns> public int IndexOf(object o, IComparer compar) { int index = 0; while (index < this.count) { if (compar.Compare(this.array[index], o) == 0) { return index; } ++index; } return -1; } /// <summary> /// 实现IList<T>接口的Remove方法 /// </summary> /// <param name="value"></param> /// <returns></returns> public bool Remove(T value) { int index = this.IndexOf(value); if (index >= 0) { this.RemoveRange(index, 1); return true; } return false; } /// <summary> /// 显示实现IList接口的Remove方法,此处显示实现 /// </summary> /// <param name="value"></param> void IList.Remove(object value) { ((IList<T>)this).Remove((T)value); } /// <summary> /// 从集合指定位置删除对象的引用 /// </summary> /// <param name="index"></param> public void RemoveAt(int index) { RemoveRange(index, 1); } /// <summary> /// 弹出集合的最后一个元素 /// </summary> /// <returns></returns> public object PopBack() { object o = this.array[this.count - 1]; RemoveAt(this.count - 1); return o; } /// <summary> /// 弹出集合第一个对象 /// </summary> /// <returns></returns> public object PopFront() { object o = this.array[0]; RemoveAt(0); return o; } /// <summary> /// 实现IList<T>接口的Insert方法 /// </summary> /// <param name="index"></param> /// <param name="value"></param> public void Insert(int index, T value) { if (index >= this.count) { throw new ArgumentOutOfRangeException("index"); } int newCount = this.count + 1; if (this.array.Length < newCount) { T[] newArray = GetNewArray(); Array.Copy(this.array, newArray, index); newArray[index] = value; Array.Copy(this.array, index, newArray, index + 1, this.count - index); this.array = newArray; } else { Array.Copy(this.array, index, this.array, index + 1, this.count - index); this.array[index] = value; } this.count = newCount; } /// <summary> /// 显示实现IList接口的Insert方法 /// </summary> /// <param name="index"></param> /// <param name="value"></param> void IList.Insert(int index, object value) { ((IList<T>)this).Insert(index, (T)value); } /// <summary> /// 实现IList<T>接口的Contains方法 /// </summary> /// <param name="value"></param> /// <returns></returns> public bool Contains(T value) { return this.IndexOf(value) >= 0; } /// <summary> /// 显示实现IList<T>接口的Contains方法 /// </summary> /// <param name="value"></param> /// <returns></returns> bool IList.Contains(object value) { return ((IList<T>)this).IndexOf((T)value) >= 0; } /// <summary> /// 将集合压缩为实际长度 /// </summary> public void TrimToSize() { if (this.array.Length > this.count) { T[] newArray = null; if (this.count > 0) { newArray = new T[this.count]; Array.Copy(this.array, newArray, this.count); } else { newArray = new T[1]; } this.array = newArray; } } /// <summary> /// 清空集合 /// </summary> public void Clear() { this.count = 0; } /// <summary> /// 实现IEnumerable接口的GetEnumerator方法 /// </summary> /// <returns></returns> public IEnumerator<T> GetEnumerator() { Enumertor<T> ator = new Enumertor<T>(this); return ator; } /// <summary> /// 显示实现IEnumerable接口的GetEnumerator方法 /// </summary> /// <returns></returns> IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<T>)this).GetEnumerator(); } /// <summary> /// 实现ICollection<T>接口的CopyTo方法 /// </summary> /// <param name="array"></param> /// <param name="index"></param> public void CopyTo(T[] array, int index) { Array.Copy(this.array, 0, array, index, this.count); } /// <summary> /// 显示实现实现ICollection<T>接口的CopyTo方法 /// </summary> /// <param name="array"></param> /// <param name="index"></param> void ICollection.CopyTo(Array array, int index) { Array.Copy(this.array, 0, array, index, this.count); } }
Appel :
static void Main(string[] args) { //由于已经指定了int,因此加入值类型不会有装箱拆箱操作。 List<int> tList = new List<int>(); tList.Add(25); tList.Add(30); foreach (int n in tList) { Console.WriteLine(n); } Console.ReadLine(); }
Ce qui précède est le contenu des connaissances de base de l'interface ILiest C# (17) - génériques et autres contenus connexes S'il vous plaît faites attention au site Web PHP chinois (www.php.cn) !

C # .NeTissuitableFormenterprise-LevelApplications withithemicrosofosystématetoitsstrongThpyping, RichLibrary, androbustperformance.wowever, itmayNotBeidealForcross-PlatformDevelopmentorwhenRawpeediscritical, whileLanguageSlikerUstorGomightBeferable.

Le processus de programmation de C # dans .NET comprend les étapes suivantes: 1) l'écriture de code C #, 2) la compilation dans un langage intermédiaire (IL) et 3) l'exécution par .NET Runtime (CLR). Les avantages de C # dans .NET sont sa syntaxe moderne, son système de type puissant et son intégration serrée avec le Framework .NET, adapté à divers scénarios de développement des applications de bureau aux services Web.

C # est un langage de programmation moderne et orienté objet développé par Microsoft et dans le cadre du .NET Framework. 1.C # prend en charge la programmation orientée objet (POO), y compris l'encapsulation, l'héritage et le polymorphisme. 2. La programmation asynchrone en C # est implémentée via Async et attend des mots clés pour améliorer la réactivité des applications. 3. Utilisez LINQ pour traiter les collections de données concisement. 4. Les erreurs courantes incluent les exceptions de référence NULL et les exceptions indexes hors gamme. Les compétences de débogage comprennent l'utilisation d'un débogueur et une gestion des exceptions. 5. L'optimisation des performances comprend l'utilisation de StringBuilder et d'éviter l'emballage et le déballage inutiles.

Les stratégies de test pour les applications C # .NET comprennent les tests unitaires, les tests d'intégration et les tests de bout en bout. 1. Le test unitaire garantit que l'unité minimale du code fonctionne indépendamment, en utilisant le cadre MSTEST, NUnit ou Xunit. 2. Les tests intégrés vérifient les fonctions de plusieurs unités combinées et des données simulées couramment utilisées et des services externes. 3. Les tests de bout en bout simulent le processus de fonctionnement complet de l'utilisateur et le sélénium est généralement utilisé pour les tests automatisés.

L'entrevue avec C # Developer Senior Developer nécessite de maîtriser les connaissances de base telles que la programmation asynchrone, la LINQ et les principes de travail internes des frameworks .NET. 1. La programmation asynchrone simplifie les opérations par asynchronisation et attend pour améliorer la réactivité de l'application. 2.Linq exploite des données dans le style SQL et fait attention aux performances. 3. La CLR du cadre net gère la mémoire et la collecte des ordures doit être utilisée avec prudence.

C # .NET Les questions et réponses d'entrevue comprennent les connaissances de base, les concepts de base et l'utilisation avancée. 1) Connaissances de base: C # est un langage orienté objet développé par Microsoft et est principalement utilisé dans le framework .NET. 2) Concepts de base: la délégation et les événements permettent des méthodes de liaison dynamiques, et LINQ fournit des fonctions de requête puissantes. 3) Utilisation avancée: la programmation asynchrone améliore la réactivité et les arbres d'expression sont utilisés pour la construction de code dynamique.

C # .NET est un choix populaire pour construire des microservices en raison de son fort écosystème et de son riche soutien. 1) Créez RestulAPI à l'aide d'Asp.Netcore pour traiter la création et la requête de l'ordre. 2) Utilisez GRPC pour obtenir une communication efficace entre les microservices, définir et mettre en œuvre les services de commande. 3) Simplifiez le déploiement et la gestion via des microservices conteneurisés Docker.

Les meilleures pratiques de sécurité pour C # et .NET incluent la vérification des entrées, le codage de sortie, la gestion des exceptions, ainsi que l'authentification et l'autorisation. 1) Utilisez des expressions régulières ou des méthodes intégrées pour vérifier les entrées afin d'empêcher les données malveillantes d'entrer dans le système. 2) Encodage de sortie pour empêcher les attaques XSS, utilisez la méthode HTTPutility.htmLencode. 3) La gestion des exceptions évite la fuite d'informations, enregistre les erreurs mais ne renvoie pas d'informations détaillées à l'utilisateur. 4) Utilisez ASP.NetIdentity et l'autorisation fondée sur les réclamations pour protéger les applications contre l'accès non autorisé.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Dreamweaver Mac
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

SublimeText3 Linux nouvelle version
Dernière version de SublimeText3 Linux

Version Mac de WebStorm
Outils de développement JavaScript utiles

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.