Résoudre le problème du passage du tableau C# en paramètre

黄舟
Libérer: 2017-09-19 11:28:21
original
2288 Les gens l'ont consulté

Principe : Contrôlez autant que possible la modification des données. S'il peut être prédit que certaines données ne seront pas ou ne doivent pas être modifiées, elles doivent être contrôlées et ne pas s'attendre à ce que l'appelant utilisant ces données le fasse. ne change pas sa valeur.

Si les paramètres sont accidentellement modifiés pendant l'utilisation, des résultats imprévisibles se produiront, et ce type d'erreur est difficile à détecter, nous devons donc en tenir pleinement compte lors de la conception des paramètres de la méthode. paramètres ou en passant des paramètres de type référence par référence.

Si une donnée ne peut pas être modifiée pendant le processus de transfert, la valeur (champ ou attribut) ne doit pas être modifiée lors de la construction de l'objet.

1. Contrôle des paramètres simples

1. Passage des paramètres de type valeur

Dans ce cas, le passé It est une copie du paramètre, n'affecte pas la valeur d'origine et ne nécessite aucun contrôle.

2. Passer les paramètres de type référence

a. Une structure de données composée de types de valeur

doit définir le champ. en lecture seule, les attributs sont uniquement obtenus. L'affectation ne peut être effectuée que via le constructeur.

b. Structure de données contenant des champs de type référence

Cette situation est récursive Vous devez vous assurer que les champs sont en lecture seule et que les attributs sont obtenus en même temps. , les champs de type de référence sont des types d'utilisation qui répondent également à cette exigence.


public class SuperClass
{    private readonly int  _no;    private readonly SubClass _tag; 
    public int NO
   {         get{ return _no;}
   }    
    public SubClass Tag
    {         get{ retirn _tag;}
     }      
      public SuperClass(int no,SubClass tag)
      {
            _no=no;
            _tag=tag;   
       }
} 
 
public class SubClass
{     private readonly int _field;     
     public int Field
     {          get{ return _field;}
     } 
     public SubClass(int field)
    {
          _field=field;
     }
}
Copier après la connexion

2. Contrôle du passage de paramètres de type référence complexes

La soi-disant complexité signifie que le paramètre est un tableau ou type de collection, ou les paramètres contiennent ces types de données. Dans ce cas, la méthode ci-dessus ne peut pas garantir que les données du paramètre ne seront pas modifiées, car même si l'objet est en lecture seule, les champs (propriétés) du tableau ou de la collection. dans l'objet peut toujours être modifié.

1. Paramètres de collection (il en va de même pour les paramètres de référence contenant des champs de collection)

Les versions .net antérieures à 4.5 peuvent utiliser des interfaces qui ne contiennent pas de méthodes pour modifier la collection éléments au lieu d’un type de collection spécifique. Par exemple, utilisez l'interface IEnumerable au lieu de List. La version 4.5 peut utiliser directement l'interface IReadOnlyCollection ou un type de collection qui implémente cette interface.

2. Paramètres du tableau

Il n'existe aucun bon moyen de protéger les paramètres de type tableau contre la modification, alors essayez d'éviter d'utiliser les types de tableau comme paramètres de méthode à moins que des paramètres facultatifs ne le soient. utilisé quand.

3. Pour comprendre les choses ci-dessus, vous devez distinguer la différence entre les concepts

1.

2. La différence entre le passage par valeur et le passage par référence (ref et out)

3. La différence entre le passage de paramètres de type référence et le passage par référence (ref et out) de paramètres de type référence. [C'est le plus déroutant]

La différence est que lorsqu'un nouvel objet est créé pour la référence lors de l'utilisation de ce paramètre, le premier n'affecte pas la valeur d'origine, tandis que le second affecte la valeur d'origine. Exemple :


void FunA(MyClass a)

{

     a=new MyClass("A");

} 

void FunB(ref MyClass a)

{

     a=new MyClass("B");

} 

void Test()

{

  MyClass a=new MyClass("A");   

      FunA(a);                

      Print(a);              //a还是原始的对象 TEST
 

      FunB(ref a);

       Print(a);               //a变为新对象   B}
Copier après la connexion

Rappelez-vous un principe :

Les types valeur transmettent une copie de la valeur et les types référence transmettent un objet références, donc les modifications apportées aux paramètres de valeur n'affectent pas la valeur d'origine. Les types de référence Les modifications affectent la valeur d'origine la construction du paramètre transmise par valeur n'affecte pas la valeur d'origine et le passage de référence (réf et sortie) affecte la valeur d'origine.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal