2024-01-19 18:07:00
Depuis la douzième version du langage C# dans .NET 8.0, il existe également un modificateur pour les paramètres de méthode ref readonly
. Avec cet ajout, la méthode n’est pas autorisée à modifier la valeur reçue ou la référence de l’objet reçu. Lors du passage de types de référence via ref readonly
Cependant, la méthode peut toujours modifier le contenu des objets individuels.
Publicité
Dr. Holger Schwichtenberg est expert technologique en chef chez MAXIMAGO, qui propose un développement de logiciels innovant et basé sur l’expérience, y compris dans des domaines hautement critiques liés à la sécurité. Il est également à la tête du réseau d’experts www.IT-Visions.de, qui soutient de nombreuses moyennes et grandes entreprises avec des conseils et des formations dans le développement et l’exploitation de logiciels avec 43 experts renommés.
Le tableau suivant fournit ref readonly
par rapport aux autres modificateurs de paramètres. Ce qui est important pour le comportement est de savoir si un type valeur ou un type référence est passé en paramètre :
Le paramètre est de type valeur | Le paramètre est un type de référence | ||
La méthode peut changer de valeur | La méthode peut modifier les valeurs individuelles dans l’objet transmis | La méthode peut attribuer un nouvel objet | |
Passer sans modificateurs | Oui, mais l’appelant ne reçoit pas la nouvelle valeur | Et | Oui, mais l’appelant ne reçoit pas le nouvel objet |
Remise avec | Non | Et | Non |
Remise avec réf | Et | Et | Et |
Passage avec ref en lecture seule (depuis C# 12.0) | Non | Et | Non |
Remise sans | Et | Et | Et |
Les trois listes suivantes montrent des exemples, y compris une capture d’écran de la sortie d’écran respective.
Le premier code montre l’effet des modificateurs de paramètres pour les paramètres en tant que type de valeur.
///
/// Wertetypen an Methode übergeben
///
public void ParameterValueTypes()
{
CUI.H2(nameof(ParameterValueTypes));
#region
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = 50;
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a + ";" + b + ";" + c + ";" + d + ";" + e);
string r = ParameterDemoValueTypes(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r); // 11;20;31;40
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a + ";" + b + ";" + c + ";" + d + ";" + e);
#endregion
}
public string ParameterDemoValueTypes(int WertValue, in int WertIn,
ref int WertRef,
ref readonly int WertRefRO,
out int WertOut)
{
WertValue++;
// nicht erlaubt, da in-Wert: WertIn++;
WertRef++;
// WertRefRO++; // nicht erlaubt, da readonly
// nicht erlaubt, da noch nicht initialisiert: WertOut++;
WertOut = 41;
return WertValue.ToString() + ";" + WertIn.ToString() + ";"
+ WertRef.ToString() + ";" + WertOut.ToString();
}
Le code produit le résultat suivant :
La liste suivante utilise un paramètre comme paramètre de type référence (class Counter
). La méthode modifie la valeur de l’objet.
class Counter
{
public string Name { get; set; }
public int Value { get; set; }
public override string ToString() => Name + "=" + Value;
}
///
/// Referenztypen an Methode übergeben, die Wert in dem Objekt ändert
///
public void ParameterReferenceType1()
{
CUI.H2(nameof(ParameterReferenceType1));
Counter a = new Counter() { Name = "a", Value = 10 };
Counter b = new Counter() { Name = "b", Value = 20 };
Counter c = new Counter() { Name = "c", Value = 30 };
Counter d = new Counter() { Name = "d", Value = 40 };
Counter e = new Counter() { Name = "e", Value = 50 };
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
string r = ParameterDemoRef1(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r);
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}
public string ParameterDemoRef1(Counter WertValue, in Counter WertIn,
ref Counter WertRef,
ref readonly Counter WertRefRO,
out Counter WertOut)
{
WertValue.Value++;
WertIn.Value++;
WertRef.Value++;
WertRefRO.Value++;
WertOut = new Counter { Name = "d", Value = 41 };
return WertValue.ToString() + ";" + WertRef.ToString() + ";"
+ WertIn.ToString() + ";" + WertOut.ToString();
}
Le code produit le résultat suivant :
Dans le troisième exemple, le paramètre est un type référence (class Counter
). La méthode change la référence de l’objet
class Counter
{
public string Name { get; set; }
public int Value { get; set; }
public override string ToString() => Name + "=" + Value;
}
///
/// Referenztypen an Methode übergeben, die neues Objekt zuweist und ändert
///
public void ParameterReferenceType2()
{
CUI.H2(nameof(ParameterReferenceType2));
Counter a = new Counter() { Name = "a", Value = 10 };
Counter b = new Counter() { Name = "b", Value = 20 };
Counter c = new Counter() { Name = "c", Value = 30 };
Counter d = new Counter() { Name = "d", Value = 40 };
Counter e = new Counter() { Name = "e", Value = 50 };
CUI.H3("Der Aufrufer hat vorher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
string r = ParameterDemoRef2(a, b, ref c, ref d, out e);
CUI.H3("Die Methode hat folgende Werte:");
Console.WriteLine(r);
CUI.H3("Der Aufrufer hat nachher folgende Werte:");
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
Console.WriteLine(e);
}
public string ParameterDemoRef2(Counter WertValue, in Counter WertIn,
ref Counter WertRef,
ref readonly Counter WertRefRO,
out Counter WertOut)
{
WertValue = new Counter { Name = "a*", Value = 101 };
// nicht erlaubt:
// WertIn = new Counter { Name = "b*", Value = 100 };
WertRef = new Counter { Name = "c*", Value = 102 };
// nicht erlaubt, da readonly:
// WertRefRO = new Counter { Name = "c*", Value = 103 };
WertOut = new Counter { Name = "d*", Value = 104 };
return WertValue.ToString() + ";" + WertRef.ToString() + ";"
+ WertIn.ToString() + ";" + WertOut.ToString();
}
Le code produit le résultat suivant :
(moi)
#Nouveau #dans #.NET #ref #lecture #seule
1705681260