when (Riferimenti per C#)when (C# Reference)

È possibile utilizzare la when parola chiave contestuale per specificare una condizione di filtro nei contesti seguenti:You can use the when contextual keyword to specify a filter condition in the following contexts:

when in un'istruzione catchwhen in a catch statement

A partire da C# 6 when può essere usata in un'istruzione catch per specificare una condizione che deve essere vera per eseguire il gestore di una determinata eccezione.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. La relativa sintassi è la seguente:Its syntax is:

catch (ExceptionType [e]) when (expr)

dove expr è un'espressione che dà come risultato un valore booleano.where expr is an expression that evaluates to a Boolean value. Se restituisce true, il gestore di eccezioni viene eseguito, se restituisce false, non viene eseguito.If it returns true, the exception handler executes; if false, it does not.

Nell'esempio seguente viene usata la parola chiave when per eseguire in modo condizionale i gestori per un elemento HttpRequestException in base al testo del messaggio dell'eccezione.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 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 un'istruzione switchwhen in a switch statement

A partire da C# 7.0 non è più necessario che le etichette case siano reciprocamente esclusive e l'ordine in cui le etichette case appaiono in un'istruzione switch può determinare quale blocco switch eseguire.Starting with C# 7.0, 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. La parola chiave when può essere usata per specificare una condizione di filtro che fa sì che l'etichetta case associata sia vera solo se è vera anche la condizione di filtro.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. La relativa sintassi è la seguente:Its syntax is:

case (expr) when (when-condition):

dove expr è un modello costante o un modello del tipo che viene confrontato con l'espressione di corrispondenza e when-condition è qualsiasi espressione booleana.where expr is a constant pattern or type pattern that is compared to the match expression, and when-condition is any Boolean expression.

Nell'esempio seguente viene usata la parola chiave when per testare gli oggetti Shape che hanno un'area pari a zero, nonché una varietà di oggetti Shape che hanno un'area maggiore di zero.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 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 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 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 square:
//          Length of a side: 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

Vedere ancheSee also