Principe :Contrôlez autant que possible les modifications apportées aux données. Si vous pouvez prévoir que certaines données ne seront pas ou ne devraient pas être modifiées, contrôlez-les, et ne vous attendez pas à ce que les appelants utilisant ces données ne modifient pas leur valeur.
Si un paramètre est modifié accidentellement pendant son utilisation, cela entraînera des résultats imprévisibles, et de telles erreurs sont difficiles à détecter. Par conséquent, lors de la conception des paramètres de méthode, nous devons pleinement prendre en compte les conséquences possibles du passage de paramètres de type référence ou du passage de paramètres de type référence par référence.
Si une donnée ne peut pas être modifiée lors du passage, ses valeurs (champs ou propriétés) doivent être rendues non modifiables lors de la construction de l'objet.
I. Contrôle des paramètres simples
1. Passage de paramètres de type valeur
Dans ce cas, comme une copie du paramètre est passée, la valeur d'origine n'est pas affectée, donc aucun contrôle n'est nécessaire.
2. Passage de paramètres de type référence
a. Structures de données composées de types valeur
Les champs doivent être définis en lecture seule, et les propriétés ne doivent avoir que des accesseurs get. L'affectation ne peut se faire que via les constructeurs.
b. Structures de données contenant des champs de type référence
Cette situation est récursive. Tout en garantissant que les champs sont readonly et que les propriétés n'ont que des accesseurs get, les types utilisés par les champs de type référence doivent également satisfaire aux mêmes exigences.
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;
}
}
II. Contrôle sur le passage de paramètres complexes de type référence
Le soi-disant "complexe" signifie que le paramètre est un tableau ou un type de collection, ou que le paramètre contient des données de ces types. Dans ce cas, les méthodes ci-dessus ne peuvent 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 (ou propriétés) de type tableau ou collection dans l'objet peuvent encore être modifiés.
1. Paramètres de collection (idem pour les paramètres de référence contenant des champs de collection)
Pour les versions antérieures à .NET 4.5, vous pouvez utiliser des interfaces qui n'incluent pas de méthodes de modification des éléments de collection pour remplacer des types de collection concrets. Par exemple, utilisez IEnumerable
2. Paramètres de tableau
Il n'existe pas de bon moyen de protéger les paramètres de type tableau contre la modification, donc essayez d'éviter d'utiliser des types tableau comme paramètres de méthode, sauf lorsque des paramètres optionnels sont nécessaires.
III. Pour comprendre ce qui précède, vous devez clairement distinguer les différences entre les concepts suivants
- 1. La différence entre les types valeur et les types référence
- 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 de paramètres de type référence par référence (ref et out) [Ce point est le plus déroutant]
La différence est que lorsqu'un nouvel objet est créé pour la référence pendant l'utilisation du 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
}
Rappelez-vous un principe :Les types valeur transmettent une copie de la valeur, les types référence transmettent une référence d'objet. Par conséquent, les modifications apportées aux paramètres de type valeur n'affectent pas la valeur d'origine, tandis que les modifications apportées aux types référence affectent la valeur d'origine ; construire un paramètre passé par valeur n'affecte pas la valeur d'origine, tandis que le passage par référence (ref et out) affecte la valeur d'origine.
Adresse d'origine : https://www.cnblogs.com/from1991/p/5335585.html