SoFunction
Updated on 2025-03-07

Summary of new features in C# 6.0

1. Static using(static using)

The static using declaration allows static methods to be called directly without using the class name.

The static using declaration allows invoking static methods without the class
name.
In C# 5
using System;
("Hello, World!");
In C# 6
using static ;
WriteLine("Hello, World");

2. Expression-Bodied Methods

Using expression methods, only one statement method can be written using lambda syntax.

With expression-bodied methods, a method that includes just one statement can
be written with the lambda syntax.
In C# 5
public bool IsSquare(Rectangle rect)
{
return  == ;
}
In C# 6
public bool IsSquare(Rectangle rect) =>  == ;

3. Expression-Bodied Properties

Similar to expression methods, only a single-line attribute of a get accessor can be written using lambda syntax.

Similar to expression-bodied methods, one-line properties with only a get accessor
can be written with the lambda syntax
In C# 5
public string FullName
{
get
{
return FirstName +"" + LastName;
}
}
In C# 6
public string FullName => FirstName +"" + LastName;

4. Auto-Implemented Property Initializers

Automatic properties can be initialized using the property initializer.

Auto-implemented properties can be initialized with a property initializer.

In C# 5
public class Person
{
public Person()
{
Age = 24;
}
public int Age {get; set;}
}
In C# 6
public class Person
{
public int Age {get; set;} = 42;
}

5. Read-Only Auto Properties

C# 5 requires complete attribute syntax to implement read-only attributes, and C# 6 can use automatic attributes to implement them.

To implement read-only properties, C# 5 requires the full property syntax. With
C# 6, you can do this using auto-implemented properties.
In C# 5
private readonly int _bookId;
public BookId
{
get
{
return _bookId;
}
}
In C# 6
public BookId {get;}

6. Nameof Operator

The names of fields, properties, methods, and types can be accessed through nameof. Using nameof, you can easily refactor the name changes.

With the new nameof operator, names of fields, properties, methods, or types can
be accessed. With this, name changes are not missed with refactoring.

In C# 5
public void Method(object o)
{
if (o == null) throw new ArgumentNullException("o");
In C# 6
public void Method(object o)
{
if (o == null) throw new ArgumentNullException(nameof(o));

7. Null Propagation Operator

Null pass operators simplify null checking.

The null propagation operator simplifies null checks.
In C# 5
int? age = p == null ? null : ;
var handler = Event;
if (handler != null)
{
handler(source, e);
}
In C# 6
int? age = p?.Age;
handler?.Invoke(source, e);

8. String Interpolation

The string difference removes the call to the pair and uses an expression placeholder instead of the numeric format placeholder.

The string interpolation removes calls to . Instead of using
numbered format placeholders in the string, the placeholders can include
expressions.
In C# 5
public override ToString()
{
return ("{0}, {1}", Title, Publisher);
}
In C# 6
public override ToString() => $"{Title} {Publisher}";

9. Dictionary Initializers

Dictionaries can be initialized using a collection-like dictionary initializer.

Dictionaries can now be initialized with a dictionary initializer—similar to the
collection initializer.
In C# 5
var dict = new Dictionary<int, string>();
(3,"three");
(7,"seven");
In C# 6
var dict = new Dictionary<int, string>()
{
[3] ="three",
[7] ="seven"
};

10. Exception filters

Exception filters allow you to filter before catching exceptions.

Exception filters allow you to filter exceptions before catching them.

In C# 5
try
{
//etc.
} catch (MyException ex)
{
if ( != 405) throw;
// etc.
}
In C# 6
try
{
//etc.
} catch (MyException ex) when ( == 405)
{
// etc.
}

11. Use Await(Await in Catch) on Catch

await can be used directly in catch blocks, and needs to be used in C# 5.

await can now be used in the catch clause. C# 5 required a workaround.
In C# 5
bool hasError = false;
string errorMessage = null;
try
{
//etc.
} catch (MyException ex)
{
hasError = true;
errorMessage = ;
} 
if (hasError)
{
await new MessageDialog().ShowAsync(errorMessage);
}
In C# 6
try
{
//etc.
} catch (MyException ex)
{
await new MessageDialog().ShowAsync();
}

The above is a summary of the new features of C# 6.0 introduced by the editor. I hope it will be helpful to you. If you have any questions, please leave me a message and the editor will reply to you in time. Thank you very much for your support for my website!