Mads Torgersen Language PM for C# What’s new in C# 6.0.

38
Mads Torgersen Language PM for C# What’s new in C# 6.0

Transcript of Mads Torgersen Language PM for C# What’s new in C# 6.0.

Mads TorgersenLanguage PM for C#

What’s new in C# 6.0

No big new conceptsMany small featuresClean up your code

Design philosophy

Getter-only auto-properties

public class Point{ public int X { get; set; } public int Y { get; set; } 

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Getter-only auto-properties

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Getter-only auto-properties

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Initializers for auto-properties

public class Point{ public int X { get; } = 5; public int Y { get; } = 7;

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Using static classesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Using static classesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Math.Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

Using static classesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

String interpolationusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() { return String.Format("({0}, {1})", X, Y); }}

String interpolationusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() { return "(\{X}, \{Y})"; }}

Expression-bodied methodsusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() { return "(\{X}, \{Y})"; }}

Expression-bodied methodsusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() { return "(\{X}, \{Y})"; }}

() => { return "(\{X}, \{Y})"; }

() => "(\{X}, \{Y})"

Expression-bodied methodsusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() => "(\{X}, \{Y})";}

Expression-bodied propertiesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist { get { return Sqrt(X * X + Y * Y); } }

public override string ToString() => "(\{X}, \{Y})";}

Expression-bodied propertiesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist => Sqrt(X * X + Y * Y);

public override string ToString() => "(\{X}, \{Y})";}

Expression-bodied propertiesusing System.Math;

public class Point{ public int X { get; } public int Y { get; }

public Point(int x, int y) { X = x; Y = y; }

public double Dist => Sqrt(X * X + Y * Y);

public override string ToString() => "(\{X}, \{Y})";}

Index initializerspublic class Point{ public int X { get; } public int Y { get; }

public JObject ToJson() { var result = new JObject(); result["x"] = X; result["y"] = Y; return result; }}

Index initializerspublic class Point{ public int X { get; } public int Y { get; }

public JObject ToJson() { var result = new JObject() { ["x"] = X, ["y"] = Y }; return result; }}

Index initializerspublic class Point{ public int X { get; } public int Y { get; }

public JObject ToJson() { return new JObject() { ["x"] = X, ["y"] = Y }; }}

Index initializerspublic class Point{ public int X { get; } public int Y { get; }

public JObject ToJson() => new JObject() { ["x"] = X, ["y"] = Y };}

Null-conditional operatorspublic static Point FromJson(JObject json){ if (json != null && json["x"] != null && json["x"].Type == JTokenType.Integer && json["y"] != null && json["y"].Type == JTokenType.Integer) { return new Point((int)json["x"], (int)json["y"]); } 

return null;}

Null-conditional operatorspublic static Point FromJson(JObject json){ if (json != null && json["x"]?.Type == JTokenType.Integer && json["y"]?.Type == JTokenType.Integer) { return new Point((int)json["x"], (int)json["y"]); } 

return null;}

Null-conditional operatorspublic static Point FromJson(JObject json){ if (json != null && json["x"]?.Type == JTokenType.Integer && json["y"]?.Type == JTokenType.Integer) { return new Point((int)json["x"], (int)json["y"]); } 

return null;}

?.

Null-conditional operatorspublic static Point FromJson(JObject json){ if (json != null && json["x"]?.Type == JTokenType.Integer && json["y"]?.Type == JTokenType.Integer) { return new Point((int)json["x"], (int)json["y"]); } 

return null;}

Null-conditional operatorspublic static Point FromJson(JObject json){ if (json?["x"]?.Type == JTokenType.Integer && json?["y"]?.Type == JTokenType.Integer) { return new Point((int)json["x"], (int)json["y"]); } 

return null;}

Null-conditional operators

OnChanged(this, args);

Null-conditional operators

if (OnChanged != null) { OnChanged(this, args); }

Null-conditional operators{ var onChanged = OnChanged; if (onChanged != null) { onChanged(this, args); }}

Null-conditional operators

OnChanged?.Invoke(this, args);

The nameof operatorpublic Point Add(Point point){ if (point == null) { throw new ArgumentNullException("point"); }}

The nameof operatorpublic Point Add(Point other){ if (other == null) { throw new ArgumentNullException("point"); }}

The nameof operatorpublic Point Add(Point point){ if (point == null) { throw new ArgumentNullException(nameof(point)); }}

The nameof operatorpublic Point Add(Point other){ if (other == null) { throw new ArgumentNullException(nameof(other)); }}

Exception filterstry{ … }catch (ConfigurationException e){ }finally{ }

Exception filterstry{ … }catch (ConfigurationException e) if (e.IsSevere){ }finally{ }

Await in catch and finallytry{ … }catch (ConfigurationException e) if (e.IsSevere){ await LogAsync(e);}finally{ await CloseAsync();}

roslyn.codeplex.com

Learn more at …