when (C#-Referenz)

Sie können das kontextabhängige Schlüsselwort when verwenden, um eine Filterbedingung in zwei Kontexten anzugeben:

when in einer catch-Anweisung

Ab mit C# 6 kann When in einer catch-Anweisung verwendet werden, um eine Bedingung mit dem Wert „TRUE“ für den Handler anzugeben, damit eine spezifische Ausnahme ausgeführt werden kann. Die Syntax lautet:

catch ExceptionType [e] when (expr)

where expr ist ein Ausdruck, der einen booleschen Wert ergibt. Wenn true zurückgegeben wird, wird der Ausnahmehandler ausgeführt; wenn false zurückgegeben wird, nicht.

Im folgenden Beispiel wird das Schlüsselwort when verwendet, um Handler abhängig vom Text der Ausnahmemeldung für @System.Net.HttpRequestException bedingt auszuführen.

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
   static void Main()
   {
      Console.WriteLine(MakeRequest().Result);
   }

   public static async Task<string> MakeRequest()
   { 
       var client = new System.Net.Http.HttpClient();
       var streamTask = client.GetStringAsync("https://localHost:10000");
       try {
           var responseText = await streamTask;
           return responseText;
       } 
       catch (HttpRequestException e) when (e.Message.Contains("301")) {
           return "Site Moved";
       }
       catch (HttpRequestException e) when (e.Message.Contains("404")) {
           return "Page Not Found";
       }
       catch (HttpRequestException e) {
           return e.Message;
       }
   }
}

when in einer switch-Anweisung

Ab mit C# 7 müssen sich case-Bezeichnungen nicht mehr gegenseitig ausschließen, und die Reihenfolge, in der case-Bezeichnungen in einer switch-Anweisung angezeigt werden, kann bestimmen, welcher Schalterblock ausgeführt wird. Das Schlüsselwort when kann verwendet werden, um eine Filterbedingung anzugeben, die dazu führt, dass die zugeordnete case-Bezeichnung nur TRUE ist, wenn die Filterbedingung ebenfalls TRUE ist. Die Syntax lautet:

case (expr) when (when-condition):

Wo expr ein Konstantenmuster oder Typmuster ist, das mit dem match-Ausdruck verglichen wird, und wo when-condition ein beliebiger boolescher Ausdruck ist

Im folgenden Beispiel wird das Schlüsselwort when verwendet, um auf Shape-Objekte zu testen, die einen Bereich von 0 haben, und um auf eine Vielzahl von Shape-Objekten zu testen, die einen Bereich größer als 0 aufweisen.

using System;

public abstract class Shape
{
   public abstract double Area { get; }
   public abstract double Circumference { get; } 
}

public class Rectangle : Shape
{
   public Rectangle(double length, double width) 
   {
      Length = length;
      Width = width; 
   }

   public double Length { get; set; }
   public double Width { get; set; }
   
   public override double Area
   { 
      get { return Math.Round(Length * Width,2); } 
   } 
   
   public override double Circumference 
   {
      get { return (Length + Width) * 2; }
   }
}

public class Square : Rectangle
{
   public Square(double side) : base(side, side) 
   {
      Side = side; 
   }

   public double Side { get; set; }
}

public class Example
{
   public static void Main()
   {
      Shape sh = null;
      Shape[] shapes = { new Square(10), new Rectangle(5, 7),
                         new Rectangle(10, 10), sh, new Square(0) };
      foreach (var shape in shapes)
         ShowShapeInfo(shape);
   }

   private static void ShowShapeInfo(Object obj)
   {
      switch (obj)
      {
         case Shape shape when shape.Area == 0:
            Console.WriteLine($"The shape: {shape.GetType().Name} with no dimensions");
            break;
         case Rectangle r when r.Area > 0:
            Console.WriteLine("Information about the rectangle:");
            Console.WriteLine($"   Dimensions: {r.Length} x {r.Width}");
            Console.WriteLine($"   Area: {r.Area}");
            break;
         case Square sq when sq.Area > 0:
            Console.WriteLine("Information about the square:");
            Console.WriteLine($"   Length of a side: {sq.Side}");
            Console.WriteLine($"   Area: {sq.Area}");
            break;
         case Shape shape:
            Console.WriteLine($"A {shape.GetType().Name} shape");
            break;
         case null:
            Console.WriteLine($"The {nameof(obj)} variable is uninitialized.");
            break;
         default:
            Console.WriteLine($"The {nameof(obj)} variable does not represent a Shape.");
            break;   
      }
   }
}
// The example displays the following output:
//       Information about the rectangle:
//          Dimensions: 10 x 10
//          Area: 100
//       Information about the rectangle:
//          Dimensions: 5 x 7
//          Area: 35
//       Information about the rectangle:
//          Dimensions: 10 x 10
//          Area: 100
//       The obj variable is uninitialized.
//       The shape: Square with no dimensions

Siehe auch

switch-Anweisung
Try-Catch-Anweisung
try/catch/finally-Anweisung