when (C#-Referenz)when (C# Reference)

Sie können das kontextabhängige Schlüsselwort when verwenden, um eine Filterbedingung in zwei Kontexten anzugeben:You can use the when contextual keyword to specify a filter condition in two contexts:

when in einer catch-Anweisungwhen in a catch statement

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.Starting with C# 6, When can be used in a catch statement to specify a condition that must be true for the handler for a specific exception to execute. Die Syntax lautet:Its syntax is:

catch ExceptionType [e] when (expr)

where expr ist ein Ausdruck, der einen booleschen Wert ergibt.where expr is an expression that evaluates to a Boolean value. Wenn true zurückgegeben wird, wird der Ausnahmehandler ausgeführt; wenn false zurückgegeben wird, nicht.If it returns true, the exception handler executes; if false, it does not.

Im folgenden Beispiel wird das Schlüsselwort when verwendet, um Handler abhängig vom Text der Ausnahmemeldung für HttpRequestException bedingt auszuführen.The following example uses the when keyword to conditionally execute handlers for an HttpRequestException depending on the text of the exception message.

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-Anweisungwhen in a switch statement

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.Starting with 7, case labels no longer need be mutually exclusive, and the order in which case labels appear in a switch statement can determine which switch block executes. 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.The when keyword can be used to specify a filter condition that causes its associated case label to be true only if the filter condition is also true. Die Syntax lautet:Its syntax is:

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 istwhere expr is a constant pattern or type pattern that is compared to the match expression, and when-condition is any Boolean expression.

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.The following example uses the when keyword to test for Shape objects that have an area of zero, as well as to test for a variety of Shape objects that have an area greater than zero.

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 auchSee also

switch-Anweisungswitch statement
Try-Catch-Anweisungtry/catch statement
try/catch/finally-Anweisungtry/catch/finally statement