Adam Ralph has a list of the probable C# 6.0 features Mads Torgersen from the C# design team covered at new Developers Conference() NDC 2013 in London.
I thought it would be fun to show some before and after syntax for comparison and in doing so ended up with a few thoughts and questions.
1. Primary Constructors
Shorter way to write a constructor that automatically assigns to private instance variables.
Before
public class Point {
private int x, y;
public Point(int x, int y)
this.x = x;
this.y = y;
}
}
After
public class Point(int x, int y) {
private int x, y;
}
Thoughts
- Do you need to independently define x and y?
- Can you still write a body?
- How would you make the default private?
This solution feels too constrained, would have preferred something like:
public Point(set int x, set int y)
That set the property and optionally created a private one if it didn’t. Would allow bodies, use on multiple constructors etc.
2. Readonly auto properties
Readonly properties require less syntax.
Before
private readonly int x;
public int X { get { return x; } }
After
public int X { get; } = x;
Thoughts
- Love this.
- Very useful for immutable classes.
3. Static type using statements;
Imports all the public static methods of a type into the current namespace.
Before
public double A { get { return Math.Sqrt(Math.Round(5.142)); } }
After
using System.Math;
...
public double A { get { return Sqrt(Round(5.142)); } }
Thoughts
- Not something I’ve run into often but no doubt very useful for Math-heavy classes.
- Could be useful for Enumerable LINQ-heavy classes if it works with static extension methods.
4. Property Expressions
Allows you to define a property using a shorthand syntax.
Before
public double Distance {
get { return Math.Sqrt((X * X) + (Y * Y)); }
}
After
public double Distance => Math.Sqrt((X * X) + (Y * Y));
Thoughts
- Small but useful syntax reduction.
- Has nothing to do with System.Linq.Expression despite the name.
5. Method Expressions
Allows you to define a method using a shorthand syntax.
Before
public Point Move(int dx, int dy) {
return new Point(X + dx1, Y + dy1);
}
After
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
Thoughts
Same as Property Expressions.
6. Params for enumerables
No longer need to define your params methods as an array and force early evaluation of the arguments.
Before
Do(someEnum.ToArray());
...
public void Do(params int[] values) { ... }
After
Do(someEnum);
public void Do(params IEnumerable points) { ... }
Thoughts
- Can have params methods for IEnumerable and array side-by-side? Probably not.
- Is evaluation deferred until evaluated if you pass a single IEnumerable instead of a params?
7. Monadic null checking
Removes the need to check for nulls before accessing properties or methods. Known as the Safe Navigation Operator in Groovy).
Before
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
After
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Thoughts
Love it. Will reduce noise in code and hopefully reduce null reference errors everywhere!
8. Constructor type parameter inference
Removes the need to create static factory methods to infer generic types. This is helpful with Tuples etc.
Before
var x = MyClass.Create(1, "X");
...
public MyClass Create(T1 a, T2 b) {
return new MyClass(a, b);
}
After
var x = new MyClass(1, "X");
Thoughts
- Another great addition.
- Does it understand list and collection initializers to automatically determine the generic types too?
9. Inline declarations for out params
Lets you declare the out variables inline with the call.
Before
int x;
int.TryParse("123", out x);
After
int.TryParse("123", out int x);
Thoughts
- Not a particularly large syntax reduction.
- Shorter code for Try methods and DirectX.
Wrapping up
Hopefully there are a few more gems to come that would help reduce noise. Would especially like to see syntax that wired up an interface to an internal instance variable where not specifically overridden to aid in encapsulation, e.g.
public MyClass : IList => myList {
private IList myList;
public Add(object item) {
// Do something first
myList.Add(item);
}
}
[)amien
No comments:
Post a Comment