List of New Features in C# 6.0
We can discuss the new features, below is a list of few features in C# 6.0:
- Auto Property Initializer
- Primary Constructors
- Dictionary Initializer
- Declaration Expressions
Static
Using
await
inside catch
block
- Exception Filters
- Conditional Access Operator to check
NULL
Values
1. Auto Property Initialzier
Before :-
The only way to initialize an Auto Property is to implement an explicit constructor and set property values inside it.
public class AutoPropertyBeforeCsharp6
{
private string _postTitle = string.Empty;
public AutoPropertyBeforeCsharp6()
{
PostID = 1;
PostName = "Post 1";
}
public long PostID { get; set; }
public string PostName { get; set; }
public string PostTitle
{
get { return _postTitle; }
protected set
{
_postTitle = value;
}
}
}
After :-
In C# 6, auto implemented property with initial value can be initialized without having to write the constructor. We can simplify the above example to the following:
public class AutoPropertyInCsharp6
{
public long PostID { get; } = 1;
public string PostName { get; } = "Post 1";
public string PostTitle { get; protected set; } = string.Empty;
}
2. Primary Constructors
We mainly use constructor to initialize the values inside it. (Accept parameter values and assign those parameters to instance properties).
Before :-
public class PrimaryConstructorsBeforeCSharp6
{
public PrimaryConstructorsBeforeCSharp6(long postId, string postName, string postTitle)
{
PostID = postId;
PostName = postName;
PostTitle = postTitle;
}
public long PostID { get; set; }
public string PostName { get; set; }
public string PostTitle { get; set; }
}
After :-
public class PrimaryConstructorsInCSharp6(long postId, string postName, string postTitle)
{
public long PostID { get; } = postId;
public string PostName { get; } = postName;
public string PostTitle { get; } = postTitle;
}
In C# 6, primary constructor gives us a shortcut syntax for defining constructor with parameters. Only one primary constructor per class is allowed.
If you look closely at the above example, we moved the parameters initialization beside the class name.
You may get the following error “Feature ‘primary constructor’ is only available in ‘experimental’ language version.” To solve this, we need to edit the SolutionName.csproj file to get rid of this error. What you have to do is we need to add additional setting after WarningTag
.
<LangVersion>experimental</LangVersion>
Feature ‘primary constructor’ is only available in ‘experimental’ language version
3. Dictionary Initializer
Before :-
The old way of writing a dictionary
initializer is as follows:
public class DictionaryInitializerBeforeCSharp6
{
public Dictionary<string, string> _users = new Dictionary<string, string>()
{
{"users", "Venkat Baggu Blog" },
{"Features", "Whats new in C# 6" }
};
}
After :-
We can define dictionary
initializer like an array using square brackets.
public class DictionaryInitializerInCSharp6
{
public Dictionary<string, string> _users { get; } = new Dictionary<string, string>()
{
["users"] = "Venkat Baggu Blog",
["Features"] = "Whats new in C# 6"
};
}
4. Declaration Expressions
Before :-
public class DeclarationExpressionsBeforeCShapr6()
{
public static int CheckUserExist(string userId)
{
int id;
if (!int.TryParse(userId, out id))
{
return id;
}
return id;
}
public static string GetUserRole(long userId)
{
var user = _userRepository.Users.FindById(x => x.UserID == userId);
if (user!=null)
{
return user.City;
}
}
}
After :-
In C# 6, you can declare an local variable in the middle of the expression. With declaration expressions, we can also declare variables inside if
statements and various loop statements.
public class DeclarationExpressionsInCShapr6()
{
public static int CheckUserExist(string userId)
{
if (!int.TryParse(userId, out var id))
{
return id;
}
return 0;
}
public static string GetUserRole(long userId)
{
if ((var user = _userRepository.Users.FindById(x => x.UserID == userId) != null)
{
return user.City;
}
}
}
5. Using Statics
Before :-
To you static
members, you don’t need an instance of object to invoke a method. You use syntax as follows:
TypeName.MethodName
public class StaticUsingBeforeCSharp6
{
public void TestMethod()
{
Console.WriteLine("Static Using Before C# 6");
}
}
After :-
In C# 6, you have the ability to use the Static Members without using the type name. You can import the static
classes in the namespaces.
If you look at the below example, we moved the Static Console
class to the namespace:
using System.Console;
namespace newfeatureincsharp6
{
public class StaticUsingInCSharp6
{
public void TestMethod()
{
WriteLine("Static Using Before C# 6");
}
}
}
6.await Inside catch Block
Before C# 6, await
keyword is not available inside the catch
and finally
blocks. In C# 6, we can finally use the await
keyword inside catch
and finally
blocks.
try
{
}
catch (Exception)
{
await Logger.Error("exception logging")
}
7.Exception Filters
Exception filters allow you a feature to check an if
condition before the catch
block executes.
Consider an example that an exception occurred now we want to check if the InnerException null
, then it will execute catch
block.
try
{
}
catch (Exception ex) if (ex.InnerException == null)
{
}
try
{
}
catch (Exception ex)
{
if(ex.InnerException != null)
{
}
}
8. Conditional Access Operator to Check NULL Values?
Consider an example that we want to retrieve a UserRanking based on the UserID only if UserID is not null.
Before :-
var userRank = "No Rank";
if(UserID != null)
{
userRank = Rank;
}
var userRank = UserID != null ? Rank : "No Rank"
After :-
var userRank = UserID?.Rank ?? "No Rank";
Thank you