Home » Sciences et technologies » Nouveau dans .NET 8.0 [6]: ref en lecture seule en C# 12.0

Nouveau dans .NET 8.0 [6]: ref en lecture seule en C# 12.0

by Nouvelles
Nouveau dans .NET 8.0 [6]: ref en lecture seule en C# 12.0

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 :



(Image : Holger Schwichtenberg)

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 :



(Image : Holger Schwichtenberg)

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 :



(Image : Holger Schwichtenberg)


(moi)

Vers la page d’accueil



#Nouveau #dans #.NET #ref #lecture #seule
1705681260

You may also like

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.