Expression bodied members are a feature of C# 6.0 and provide an inline expression for properties (get only properties) and methods. This syntax is more concise, but decreases readability for multi-line underlying logic involving extensive LINQ expressions. Branching statements (if/else, switch, try) and looping statements (for, foreach, while, and do) are also not allowed (however, LINQ statements are allowed).
Consider the following example of a method.
public int TimesNineThousand(int someValue)
{
return someValue * 9000;
}
This could be more beautifully written as an expression bodied member as follows:
public int TimesNineThousand(int someValue) => someValue * 9000;
This also works for extension methods.
public static int TimesNineThousand(this int someValue) => someValue * 9000;
Note how in the above examples, the curly braces ({ }), are replaced with the lambda arrow (=>).
This can be done for public, protected, internal, private, and protected internal methods.
Expression bodied members can be virtual, override a base class method.
Also, methods can be asynchronous (returning void, Task, or Task
Consider the following get-only property.
public int Index
{
get
{
return _index;
}
}
This can be re-written as follows:
public int Index => _index;
As an additional point, the async modified can be used with an await expression - as long as the await preceeds a method that returns a Task type. The following is a commonly discussed example:
public async Task ReadFromWeb() => await RunReadFromWeb();
public Task RunReadFromWeb()
{
return this.RunWebRequest();
}
Without the await, it won't actually be run on a background thread.
The final expression bodied member feature to discuss is operators.
public static SomeClass operator +(SomeClass left, SomeClass right)
{
return new SomeClass(left.IntValue + right.IntValue);
}
This can be re-written as follows
public static SomeClass operator +(SomeClass left, SomeClass right)
=> return new SomeClass(left.IntValue + right.IntValue);