using System.Collections.Generic;
using static System.Console;
public static void Main()
ExpressionBodiedMembers();
ThrowExceptionsInExpressions();
public static void LocalFunctions()
WriteFeatureHeader("Nested functions", "Small helper functions available only in the scope of parent function");
WriteLine($"The sum of {x} and {y} is {sum}");
int Multiply(int x, int y)
WriteLine($"Multiply of {x} and {y} is {result}");
public static void OutVariables()
WriteFeatureHeader("Enhanced Out Variables", "Declare out variable inside the method call");
string s = "26-Nov-2016";
if (DateTime.TryParse(s, out DateTime date))
string stringInt = "675";
if (int.TryParse(stringInt, out int result))
public static void EnhancedTuples()
var stringAndNumber = ("programming is fun", 7);
var namedStringAndNumber = (word: "programming is fun", number: 7);
var numbers = (One:1, Two: DateTime.Now, Three: new {Pizza = "y", Toppings = "z"});
WriteFeatureHeader("Enhanced Tuples", "Declare tuples inline");
static (int count, int sum, double avg)Aggregate(IEnumerable<int> numbers)
int count = numbers.Count();
double avg = (double)sum / (double)count;
return (count, sum, avg);
public static void TupleDeconstruction()
WriteFeatureHeader("Tuple Deconstruction", "Access tuple members directly without using tuple name");
var numbers = new List<int>{5, 10, 45, 23};
(int count, int sum, double avg) = Aggregate(numbers);
Console.WriteLine($"Count: {count}, Sum: {sum}, Avg: {avg}");
public static void ExpressionBodiedMembers()
WriteFeatureHeader("Expression Bodied Members", "Use expression bodied methods for properties, constructor and distructor");
var customer = new Customer();
customer.FirstName = " Joe";
customer.LastName = " Doe ";
Console.WriteLine($"Customer Name: {customer.FullName}, Country: {customer.Country}");
public static void SwitchExpressions()
WriteFeatureHeader("Switch Expressions", "Check for variable type in switch cases");
List<object> values = new List<object>
Console.WriteLine($"Sum is {sum}");
public static int Sum(IEnumerable<object> values)
foreach (var item in values)
case IEnumerable<object> subList when subList.Any():
case IEnumerable<object> subList:
throw new InvalidOperationException("unknown item type");
public Customer() => Country = "USA";
~Customer() => Console.WriteLine("Customer terminated...");
private string _firstName;
set => _firstName = value.Trim();
private string _lastName;
set => _lastName = value.Trim();
private string _fullName;
public string FullName => $"{FirstName} {LastName}" ;
public static void ThrowExceptionsInExpressions()
WriteFeatureHeader("Throw Exceptions in Expressions", "You can now throw exceptions inline in conditional expressions, null coalescing expressions, and some lambda expressions");
catch (DivideByZeroException e)
Console.WriteLine($"Caught exception: {e.Message}");
public static double Divide(int x, int y)
return y != 0 ? x % y : throw new DivideByZeroException();
public static void WriteFeatureHeader(string name, string description)
Console.WriteLine("==============================");
Console.WriteLine($"{name}".ToUpper());
Console.WriteLine($"{description}");
Console.WriteLine("==============================");