57 lines
2.0 KiB
C#
57 lines
2.0 KiB
C#
// ReSharper disable All
|
|
|
|
namespace CS8 {
|
|
class Program {
|
|
// This is a "switch expression"
|
|
static int CalcResult(int input) => input switch {
|
|
1 => 2,
|
|
2 => 3,
|
|
_ => throw new ArgumentException("Rien ne va plus")
|
|
};
|
|
|
|
// Property Pattern:
|
|
bool IsJune(DateTime dt) => dt is { Month: 6 };
|
|
|
|
public class Address {
|
|
public string? City { get; set; }
|
|
public string? Country { get; set; }
|
|
}
|
|
|
|
public class Customer {
|
|
// ...
|
|
public Address? Address { get; set; }
|
|
}
|
|
|
|
static void Main(string[] args) {
|
|
// This is a tuple, supported since C# 7
|
|
(string, string) personInfo = ("Oli", "Sturm");
|
|
var (firstName, lastName) = personInfo;
|
|
// firstName ist jetzt "Oli" und lastName ist "Sturm"
|
|
|
|
// Positional pattern (using a tuple - hence "tuple pattern" in
|
|
// this particular case)
|
|
// Important: this works with any deconstructable type! Example
|
|
// for a class with a deconstructor included in CS9 sample.
|
|
if (personInfo is ("Oli", var olisLastName))
|
|
Console.WriteLine($"Found Oli, his last name is {olisLastName}.");
|
|
|
|
// Nested property patterns:
|
|
var customer = new Customer { Address = new Address { City = "Castle Douglas", Country = "UK" } };
|
|
if (customer is { Address: { City: "Castle Douglas" } }) {
|
|
Console.WriteLine("This customer lives around the corner");
|
|
}
|
|
|
|
// Prize question: what is the point of this?
|
|
if (customer is { } c) {
|
|
// Work with c -- it is not null and matches the (empty, but
|
|
// extensible) property pattern.
|
|
// c is a copy of the object reference, which may be useful in multi-
|
|
// threading scenarios.
|
|
// Some people really like this pattern, but in most cases
|
|
// if (customer is not null) { ... } is just a good.
|
|
// (And btw, "is not null" is not really faster than "!= null" -- but
|
|
// it could be, and it expresses intention more explicitly.
|
|
}
|
|
}
|
|
}
|
|
} |