using System.Collections.Generic;
using static System.Console;
public static void Main()
ExpressionBodiedMembers();
ThrowExceptionsInExpressions();
public static void NestedFunctions()
WriteFeatureHeader("Nested functions", "Small helper functions available only in the scope of parent function");
WriteLine($"Sum of {x} and {y} is : {x + y}");
void Multiply(int x, int y)
WriteLine($"Multiply of {x} and {y} is : {x * y}");
public static void BinaryLiterals()
WriteFeatureHeader("Binary Literals", "Declare binary literals");
WriteLine($"a: {a: 0000} b: {b: 0000} c: {c: 0000}");
WriteLine($"d: {d: 0000} e: {e: 0000} f: {f: 0000}");
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))
public static void EnhancedTuples()
WriteFeatureHeader("Enhanced Tuples", "Declare tuples inline");
var numbers = new List<int>{5, 10, 45, 23};
var aggregate = Aggregate(numbers);
Console.WriteLine($"Count: {aggregate.count}, Sum: {aggregate.sum}, Avg: {aggregate.avg}");
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("==============================");