.NET What's New or Changed in C# 6

Improvements to C# are discussed at https://github.com/dotnet/csharplang. Here, you can find proposals to the language and submit your own.

The C# 6 extensions are exception filters, string interpolation, dictionary initializers, expression-bodied methods and properties, nameof operator, await in catch, auto-property initializers, using static, the null conditional operator, and read-only auto properties.

Exception Filters

Exception Filters are clauses that determine when a given catch clause should be applied.

static void Main(string[] args)
{
	int[] array = { 1, 2, 3, 4, 5 };
	try
	{
		array[5] = 3;
	}
	catch(Exception e) when (e.Message.Contains("bounds")) // use when here
	{
		Console.WriteLine("out of bounds");
	}
}

String Interpolation

This is short for using the string.Format method which suffers from poor perfomance.

int a = 3, b = 4;
string result = $"the result of {a} x {b} is {a * b}"; // equals "the result of 3 x 4 is 12"

Dictionary / Index Initializers

This really is not very special, but before C# 6:

Dictionary<int, string> statuses = new Dictionary<int, string>
{
    { 302, "Page moved"},
    { 404, "Page not Found"},
    { 500, "Internal server error"}
};
string description = statuses[500]; // description equals "Internal server error"

And now with C# 6, assign using the index into the collection:

Dictionary<int, string> statuses = new Dictionary<int, string>
{
    [302] = "Page moved",
    [404] = "Page not Found",
    [500] = "Internal server error"
};
string description = statuses[500]; // description equals "Internal server error"

Read-only Auto-properties

This is to geared toward immutable types. Declare the auto property with a get accessor.

class Business
{
	public string Name { get; } // can only be set in the constructor
	public double Price { get; } // can only be set in the constructor
	public Business(string name, double price) // constructor
	{
		Name = name;
		Price = price;
	}
}

Expression-bodied Methods and Properties

This works for read-only properties and methods. This example uses string interpolation and read-only auto-properties

class Business
{
	public string Name { get; }
	public double Price { get;  }
	public string NameAndPrice => $"{Name} ${Price}"; // read-only property
	public override string ToString() => $"{Name} ${Price}"; // method
	public Business(string name, double price)
	{
		Name = name;
		Price = price;
	}
}

nameof Operator

There is no magic here worth explaining. Entering nameof(BusinessName) is better than simply entering "BusinessName".

var BusinessName = "None";
string varname = nameof(BusinessName); // varname equals "BusinessName"

await in catch and finally

await can now be used in catch and finally blocks.

Auto-property Initializers

This declares an initial value for an auto-property as part of the property declaration.

class Business
{
	public System.Collections.Generic.List<string> Services { get; } = new System.Collections.Generic.List<string>();
}

using static

This enables the importing of static methods of a class.

using static System.String;
using static System.Math;

null conditional operator

This operator (?) makes checking for null much easier. Replace the . with ?. or the [] with ?[].

class Business
{
	public string Name { get; } = "";
}
Business bus = null;
var busname = bus?.Name; // because bus is null, busname is set to null and no exception is thrown
var busname2 = bus?.Name ?? "undefined";

Business[] busarray = null;
busname = busarray?[0]?.Name; // no exception can possibly be thrown
Feedback
close