List of New Features in C# 6.0
We can discuss about each of the new
features, but first, below is a list of few features in C# 6.0:
1.
Auto Property Initializer
2.
Primary Consturctors
3.
Dictionary Initializer
4.
Declaration Expressions
5.
Static Using
6.
await inside catch block
7.
Exception Filters
8.
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()
{
//assign initial values
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.
Hide Copy Code
<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)
{
//Example 1
int id;
if (!int.TryParse(userId,
out id))
{
return id;
}
return id;
}
public static string GetUserRole(long userId)
{
////Example 2
var user =
_userRepository.Users.FindById(x => x.UserID == userId);
if (user!=null)
{
// work with address ...
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)
{
////Example 2
if ((var user = _userRepository.Users.FindById(x => x.UserID
== userId) != null)
{
// work with address ...
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:
Hide Copy Code
TypeName.MethodName
Hide Copy Code
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 thestatic classes in the namespaces.
If you look at the below example, we
moved the Static Console class to
the namespace:
Hide Copy Code
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 theawait keyword inside catch and finally blocks.
Hide Copy Code
try
{
//Do something
}
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.
Hide Copy Code
//Example 1
try
{
//Some code
}
catch (Exception ex) if
(ex.InnerException == null)
{
//Do work
}
//Before C# 6 we write the above code as follows
//Example 1
try
{
//Some code
}
catch (Exception ex)
{
if(ex.InnerException != null)
{
//Do work;
}
}
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;
}
//or
var userRank = UserID != null ? Rank : "No Rank"
After
var userRank = UserID?.Rank ?? "No Rank";
No comments:
Post a Comment