Neu in .NET 9.0 [9]: Array-Initialisierung mit Index-Operator in C# 13.0

Man kann in C# 13.0 neuerdings auch mit dem Index vom Ende ein Array initialisieren.

In Pocket speichern vorlesen Druckansicht

(Bild: Pincasso/Shutterstock)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Bisher schon konnte eine Initialisierung von Mengen wie Arrays mit Indexer × = y erfolgen. In C# 13.0 ist eine Array-Initialisierung auch mit Index vom Ende [^x] = y möglich mit dem Index-Operator ^, den es seit C# 8.0 gibt.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Die neue Syntax ist allerdings nur bei der Erstinitialisierung des Objekts möglich, nicht bei anderen Zuweisungen.

Folgendes Codebeispiel zeigt die Objektmengen-Initialisierung mit Index von vorne Ă— und vom Ende [^x]:

namespace NET9_Console.CS13;
 
internal class CS13_Indexer
{
 
 class ZahlenGenerator
 {
  public string[] Ziffern = new string[10];
 }
 
 /// <summary>
 /// C# 13.0: Objekt-Initialisierung mit Index vom Ende [^x] ("Implicit Indexer Access in Object Initializers")
 /// </summary>
 public void Run()
 {
  CUI.Demo(nameof(CS13_Indexer));
 
  CUI.H2("Array-Initialisierung mit Indexer von vorne nach hinten");
  var dAlt = new ZahlenGenerator()
  {
   Ziffern = {
        [0] = "null",
        [1] = "eins",
        [2] = "zwei",
        [3] = "drei",
        [4] = "vier",
        [5] = "fĂĽnf",
        [6] = "sechs",
        [7] = "sieben",
        [8] = "acht",
        [9] = "neun",
    }
  };
 
  foreach (var z in dAlt.Ziffern)
  {
   Console.WriteLine(z);
  }
 
  CUI.H2("NEU: Array-Initialisierung mit Indexer von hinten nach vorne");
  var dNeu = new ZahlenGenerator()
  {
   Ziffern = {
         [^1] = "neun",
         [^2] = "acht",
         [^3] = "sieben",
         [^4] = "sechs",
         [^5] = "fĂĽnf",
         [^6] = "vier",
         [^7] = "drei",
         [^8] = "zwei",
         [^9] = "eins",
         [^10] = "null"
   }
  };
  foreach (var z in dNeu.Ziffern)
  {
   Console.WriteLine(z);
  }
 
  CUI.H2("NEU: Array-Initialisierung mit Indexer in beide Richtungen");
  var dNeu2 = new ZahlenGenerator()
  {
   Ziffern = {
         [^1] = "neun",
         [^2] = "acht",
         [^3] = "sieben",
         [^4] = "sechs",
         [^5] = "fĂĽnf",
         [4] = "vier",
         [3] = "drei",
         [2] = "zwei",
         [1] = "eins",
         [0] = "null"
   }
  };
 
  foreach (var z in dNeu2.Ziffern)
  {
   Console.WriteLine(z);
  }
 
  CUI.H2("NEU: Array-Befüllung zu einem späteren Zeitpunkt");
 
  // erstelle ein Array von int mit 10 Elementen
  int[] array1 = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
  // das geht nicht, Syntax nur bei Objektinitialisierung im Rahmen der Instanziierung erlaubt
  //array1 = {
  //       [^1] = 9,
  //       [^2] = 8,
  //       [^3] = 7,
  //       [^4] = 6,
  //       [^5] = 5,
  //       [0] = 0,
  //       [1] = 1,
  //       [2] = 2,
  //       [3] = 3,
  //       [4] = 4
  // }
 
  // hier geht nur das:
  array1[^1] = 9;
  array1[^2] = 8;
  array1[^3] = 7;
  array1[^4] = 6;
  array1[^5] = 5;
  array1[0] = 0;
  array1[1] = 1;
  array1[2] = 2;
  array1[3] = 3;
  array1[4] = 4;
 
  foreach (var item in array1)
  {
   CUI.LI(item);
  }
 }
}

(rme)