New C# 7.0 features in Visual Studio “15” Preview 4

Visual Studio
Over the past couple of previews, new C# language features have been trickling in, but Preview 4 marks a point where the majority of C# 7.0 are now available.
Here’s a code sample that uses a good number of these features, and that works in Preview 4 today:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span style="color: #a71d5d"><span style="font-size: 10pt">class</span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #333333"> </span></span></span><span lang="EN"><span style="font-size: 10pt;color: #795da3">Program</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="font-size: 10pt;color: #333333">{</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">static</span></span><span lang="EN"><span style="color: #333333"> </span></span><span lang="EN"><span style="color: #a71d5d">void</span></span><span lang="EN"><span style="color: #333333"> </span></span><span lang="EN"><span style="color: #795da3">Main</span></span><span lang="EN"><span style="color: #333333">(</span></span><span lang="EN"><span style="color: #a71d5d">string[]</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333"> args)</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">{</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">object</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333">[] numbers =</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">{ 0b1, 0b10, </span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">new</span></span><span lang="EN"><span style="color: #333333"> </span></span><span lang="EN"><span style="color: #a71d5d">object</span></span><span lang="EN"><span style="color: #333333">[] { 0b100, 0b1000 },<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// binary literals</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">0b1_0000, 0b10_0000 };<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// digit separators</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">var</span></span><span lang="EN"><span style="color: #333333"> (sum, count) = Tally(numbers);<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// deconstruction</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">WriteLine($</span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #183691">"Sum: {sum}, Count: {count}"</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333">);</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">}</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">static</span></span><span lang="EN"><span style="color: #333333"> (</span></span><span lang="EN"><span style="color: #a71d5d">int</span></span><span lang="EN"><span style="color: #333333"> sum, </span></span><span lang="EN"><span style="color: #a71d5d">int</span></span><span lang="EN"><span style="color: #333333"> count) </span></span><span lang="EN"><span style="color: #795da3">Tally</span></span><span lang="EN"><span style="color: #333333">(</span></span><span lang="EN"><span style="color: #a71d5d">object[]</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333"> values)<span> </span>// tuple types</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">{</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">var</span></span><span lang="EN"><span style="color: #333333"> r = (s: </span></span><span lang="EN"><span style="color: #0086b3">0</span></span><span lang="EN"><span style="color: #333333">, c: </span></span><span lang="EN"><span style="color: #0086b3">0</span></span><span lang="EN"><span style="color: #333333">);<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// tuple literals</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">void</span></span><span lang="EN"><span style="color: #333333"> Add(</span></span><span lang="EN"><span style="color: #a71d5d">int</span></span><span lang="EN"><span style="color: #333333"> s, </span></span><span lang="EN"><span style="color: #a71d5d">int</span></span><span lang="EN"><span style="color: #333333"> c) { r = (r.s + s, r.c + c); } </span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// local functions</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">foreach</span></span><span lang="EN"><span style="color: #333333"> (</span></span><span lang="EN"><span style="color: #a71d5d">var</span></span><span lang="EN"><span style="color: #333333"> v </span></span><span lang="EN"><span style="color: #a71d5d">in</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333"> values)</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">{</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">switch</span></span><span lang="EN"><span style="color: #333333"> (v)<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// switch on any value</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">{</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">case</span></span><span lang="EN"><span style="color: #333333"> </span></span><span lang="EN"><span style="color: #a71d5d">int</span></span><span lang="EN"><span style="color: #333333"> i:<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// type patterns</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">Add(i, </span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #0086b3">1</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333">);</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">break</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333">;</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">case</span></span><span lang="EN"><span style="color: #333333"> </span></span><span lang="EN"><span style="color: #a71d5d">object</span></span><span lang="EN"><span style="color: #333333">[] a </span></span><span lang="EN"><span style="color: #a71d5d">when</span></span><span lang="EN"><span style="color: #333333"> a.Length > </span></span><span lang="EN"><span style="color: #0086b3">0</span></span><span lang="EN"><span style="color: #333333">:<span> </span></span></span></span><span lang="EN"><span style="font-size: 10pt;color: #969896">// case conditions</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">var</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333"> t = Tally(a);</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">Add(t.sum, t.count);</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">break</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333">;</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">}</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">}</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span style="font-family: 'Consolas'"><span lang="EN"><span><span style="color: #333333"><span style="font-size: 10pt"> </span></span></span></span><span style="font-size: 10pt"><span lang="EN"><span style="color: #a71d5d">return</span></span></span><span lang="EN"><span style="font-size: 10pt;color: #333333"> r;</span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="color: #333333"><span><span style="font-size: 10pt"> </span></span><span style="font-size: 10pt">}</span></span></span></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"><span lang="EN"><span style="font-family: 'Consolas'"><span style="font-size: 10pt;color: #333333">}</span></span></span><span lang="EN"></span></p> <p class="MsoNormal" style="margin: 0in 0in 0pt;line-height: normal"></p> |
For a full write-up about tuples, deconstruction, pattern matching, local functions, and the rest of C# 7.0, head over to the .NET Blog.
Earlier versions of some of these features were shown at Build 2016.
Happy hacking!
![]() | Mads Torgersen, C# Language Program Manager @MadsTorgersen Mads leads the design of the C# language. During his 11 years at Microsoft he also contributed to Typescript, Roslyn, Visual Basic, and LINQ. Before that he was a professor at Aarhus University, doing research on programming languages and type systems. |