I just installed Visual Studio 2015 Preview on a Windows 10 tech. preview, the first thing I wanted to try out was C# 6.0.
The are a lot of videos and posts on internet about the new features of C# 6.0. The goal of this post is to test them by myself and share my impressions. I will use this post in the future as a personal reference for C# 6.0 new features.
C# 6.0 new feautures
This is the list of new features I have collected so far:
- Getter only auto properties
- Auto-Initialization of properties
- Calculated properties with body expressions
- Null conditional operators ?.
- Operator nameof()
- Strings projections
- Exceptions filters
- Await in catch and finally
- Index initializers
I wrote a small sample class that I will use as an example to test the new features.
This is the C# 5 sample class:
using System; namespace ConsoleApplication1 { public class Person { public Person(string name, int age) { if (name == null) { throw new NullReferenceException("name"); } Name = name; Age = age; Id = GetNewId(); } public string Name { get; set; } public int Id { get; private set; } public int Age { get; set; } public event EventHandler Call; protected virtual void OnCall() { EventHandler handler = Call; if (handler != null) handler(this, EventArgs.Empty); } public int GetYearOfBirth() { return DateTime.Now.Year - Age; } public JObject ToJSon() { var personAsJson = new JObject(); personAsJson["id"] = this.Id; personAsJson["name"] = this.Name; personAsJson["age"] = this.Age; return personAsJson; } #region Get new person id private static int lastId; private static int GetNewId() { lastId++; Logger.WriteInfo(string.Format("New Id = {0}", lastId)); return lastId; } #endregion } }
Applying C# 6.0 new features to a C# 5.0 class:
Now lets go throw the list of new features and apply them to our sample class:
Getter only auto properties
We can remove “private set” from read-only properties, properties with only a “setter” can be initialized only from the constructor or with auto-initialization.
public int Id { get; }
Auto-Initialization of properties
Using auto initialization we can auto initialize the Id property calling a method. It is also possible to set a default value to editable properties:
public int Id { get; } = GetNewId(); public int Age { get; set; } = 18;
Calculated properties with body expressions
It is common to have a lot of single line calculated properties or methods on our code. In lambda expressions it was already possible to write only the value to return. Now this is also possible in normal methods:
Our “GetYearOfBirth” method can be re-write like this:
public int GetYearOfBirth => DateTime.Now.Year - Age;
Note that if the method has not parameters we can also avoid the parentheses.