Technology articles

Probable C# 6.0 features illustrated  

C# 6.0 is now available and the final list of features is well explained by Sunny Ahuwanya so go there and try it with his interactive samples page.

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.


public class Point {
    private int x, y;

    public Point(int x, int y)
        this.x = x;
        this.y = y;


public class Point(int x, int y) {
    private int x, y;


  • 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.


private readonly int x;
public int X { get { return x; } }


public int X { get; } = x;  


  • 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.


public double A { get { return Math.Sqrt(Math.Round(5.142)); } }


using System.Math;
public double A { get { return Sqrt(Round(5.142)); } }


  • 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.


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


public double Distance => Math.Sqrt((X * X) + (Y * Y));


  • 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.


public Point Move(int dx, int dy) {
    return new Point(X + dx1, Y + dy1);


public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);


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.


public void Do(params int[] values) { ... }


public void Do(params IEnumerable<Point> points) { ... }


  • 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).


if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
return -1;


var bestValue = points?.FirstOrDefault()?.X ?? -1;


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.


var x = MyClass.Create(1, "X");
public MyClass<T1, T2> Create<T1, T2>(T1 a, T2 b) {
    return new MyClass<T1, T2>(a, b);


var x = new MyClass(1, "X");


  • 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.


int x;
int.TryParse("123", out x);


int.TryParse("123", out int x);


  • 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


Windows media keys on a regular keyboard  

Many full-size Windows keyboards come with extra buttons some of which are of questionable value but the volume and music controls are useful especially if you’re a programmer that likes to listen to music all day.

Unfortunately my two keyboards of choice (DAS Ultimate and Topre Realforce) do not come with such controls. Neither does my MacBook Pro but Apple do the elegant thing and repurpose some of the function keys.

Apple media control keys

If only I could do that on my keyboards and take advantage of the Windows global music controls. (It also makes testing a bit easier if you support background music playback in your Windows Store apps). In fact Windows 8 even has a great little pop-up that comes up to show you what you’re doing:

Windows 8 music overlay

Thankfully with the help of the wonderful AutoHotkey you can. This great little tool lets you remap keys globally or per-app and even put some scripting and macro’s in place to really take control of Windows.

My keyboards don’t have a Fn key like the Mac but given the Windows key is the modifier for system shortcuts we can repurpose that! Once you’ve unpacked and run AutoHotkey simply right-click on its system tray icon and choose Edit This Script then paste the following into the Notepad Window that opens and hit save:

; Windows Media controls in Mac positions

Now simply right-click on AutoHotkey and choose Reload This Script and enjoy Windows media controls on your laptop or regular keyboard!


Experiencing Chromecast – my review  

My eagerly-awaited Chromecast arrived a couple of weeks ago. Despite the reports that Google had run out of Netflix codes my 3-month streaming code arrived a few days before by email – a great deal given that it is also valid for current Netflix customers too.


The requirements for using a Chromecast are:

  • HDMI-capable display
  • 2.4 GHz 802.11 b/g/n Wi-Fi network
  • iOS device, Android device or laptop with Chrome

The box

The box was quite small but contained everything you need and a couple of things you might not, specifically:

  1. Chromecast device – with HDMI at one end and Micro USB at the other
  2. Micro USB to USB cable – to provide power to the device
  3. HDMI extension cable – if Chromecast is obstructed from fitting in your HDMI port
  4. USB wall socket adapter – if you don’t have USB ports available

The device itself is a rather small affair about twice as long as a HDMI connector and a little wider and thicker.


Some people are upset that it needs a USB power cable given the promo shots show no such cable.

HDMI however only supplies 50mA of power wile USB supplies 500-900mA. Chromecast is a small computer with 1080p output and Wi-Fi so it’s going to be needing a lot more than HDMI can supply. If you were hoping HDMI 1.4 would address that you’ll be disappointed.

Given that your options are:

  1. Plug USB cable into TV USB socket (if it has one that is always-on)
  2. Use included USB wall socket adapter
  3. Find something in range with an always-on USB socket


My Yamaha receiver/amp is the hub for my system and all devices have to go through to get sound (it also makes switching device simpler).

My amp lives in a small confided space below my TV which reduces the Wi-Fi range but the Apple Time Capsule is near enough for a strong single and indeed the spare USB port it has provides power.

Connecting Chromecast to an amplifier

Once connected and powered up you’ll be presented with something like this on your screen which cycles through one of many beautiful background images both during setup and when idle. I’m not sure if the images are location-aware or Google chose it because they’re also in the bay area.

Chromecast setup on TV

Cromecast starts up with it’s own temporary wireless network. Then you download one of the two setup programs for either Mac or Windows and it will switch you to that network (with no warning, I hope you weren’t downloading anything) and will prompt you for your Wi-Fi details. With any luck it will switch Chromecast over to that and it’s up to you to switch your machine back.

A WPS option would have eliminated the need for downloads and disconnects but given how few people know about WPS (it’s very hidden away on my Time Capsule) it’s an understandable omission.

Netflix Playback


The Chromecast is a very lightweight device and as such you need another device to control it. My wife and I both have iPad’s that are normally nearby so this is primarily the source of plays.

Basically the app looks as normal however you’ll see a little icon at the top right. I’m going to call this the “cast” icon as it’s also used in YouTube and the Chrome Cast plug-in. Tapping it shows which of your devices to play on. If something is already playing you get a blue bar at the top to let you jump in to control it:

Netflix + iPad asking what to play on Netflix + iPad showing already playing

Once the show or movie is playing you get artwork for the show and a bunch of controls to move forward/backward, change audio and subtitle options or go back. Hidden behind the stack of cards at the top is the episode menu for switching episode or season. This is useful as there isn’t yet a “post-play” experience to take you to the next episode automatically.

I ran into a problem that should your HDMI link be interrupted or your iPad sleep you may get the error I captured below. If you do you’ll need to quit the Netflix app and restart it to regain control.

Netflix + iPad showing already playing Netflix + iPad showing connect error


Netflix for Android behaves in a very similar way to the iPad – the same blue bar while playing and a very similar during-playback experience and menu button. I’ve not included screenshots because it is so similar but I can put them up if anyone asks :)


Running the Silverlight based player from the website also reveals the cast icon tucked between subtitles and sharing on the playback control but only if it is running within Chrome and the extension is installed. This works on both the PC and the Mac despite Silverlight for Chrome on the Mac never becoming officially supported by Microsoft.

Netflix + Silverlight showing play on

Firefox, Safari and Internet Explorer users are out of luck for now although it there is a possibility that Windows 8.1 and IE 11 with HTML5 based playback may have the option – I’ll have to try it and report back. (Windows 8.x DRM doesn’t work in a virtual machine)



I have a love-hate relationship with YouTube. I love the wide variety of content but hate the duplicate content, poor encoding, confusing channel organization, re-buffering and choppy full-screen performance on Chrome for Mac. (Works fine in Safari, how odd)

Thankfully Chromecast solves a couple of these. Re-buffering and full-screen performance are great here. Just find your video and hit the cast icon at the bottom right to choose where to start it in a similar way to Netflix.

YouTube asking what to play on

When it’s already playing the Chrome Cast extension gets involved and shows you what is going on:

Chrome Cast extension showing details

If you try clicking this icon to cast either YouTube or Netflix you’ll get a warning telling you to use the icons within the players themselves. This is a bit clunky and I would imagine Google will improve the interop here in the future so you can just always use the Cast button.


As well as video streaming you can browse web sites from Chrome using the Cast extension. Simply hit the Cast button on the toolbar and choose again where you want it to go:

Chrome Cast extension menu

There are also various options available to control how things look on the screen.

Chrome Cast extension options

Rendering quality is okay from a distance but a mess close-up most likely due to the 720p limit and some sort of scaling going on. 1 pixel lines and curves are a mess as is small text.

Usability is okay as long as you are looking at your laptop and not your TV as there is no mouse pointer, context menus, toolbars and a second or two of lag even over fast solid Wi-Fi.

Weirdly selected text shows as selected and web sites with hover effects show that effect even with no mouse. I think these omissions and inclusions are simply the result of what Chrome renders via Webkit rather than a rational set of choices.

Oddly I received performance warnings on a MacBook Pro 2.6 GHz with no major apps running.

Desktop sharing

Usability and screen display quality were massively improved by choosing the semi-hidden and experimental “Cast entire screen”:

Chrome Cast desktop sharing option

This could give offices a very cool and simple way to setup sharing for presentations in Keynote/PowerPoint without the dreaded hunt for the right cable or adapter that always seems to happen.

Lag was also improved when dropping down to lower resolutions.

Suggested improvements

It’s a great device but there is always room for improvement. I’d like to see:

  1. More video streaming services – Hulu & Amazon Prime
  2. Some music streaming services – Spotify & Pandora
  3. DLNA streaming support for existing media/libraries
  4. Native Mac OS X & Windows drivers to add Chromecast as additional wireless display
  5. Configure a source for background images when not in use

More streaming services are coming so that’s covered.

Getting DLNA support (or indeed Airplay for Mac loving friends) will probably require some open source efforts. Thankfully Google have the start of a Google Cast API/SDK available so that should just be a matter of time.

The wireless second display option would be awesome for developers, testers and presenters. Let’s hope somebody figures that out.


The Chromecast is a great device.

From the time we switched it as completely taken over our Netflix home viewing. We were using an Xbox 360 but the Chromecast:

  • is faster to launch
  • is quieter
  • supports 1080p (the Xbox runs native 1080p on only a handful of titles, everything else is hardware upscaled)
  • supports Netflix profiles
  • doesn’t play cheesy UI effect noises through my surround system
  • uses less power

Additionally instead of watching YouTube on our laptops we just cast them over to the big screen and sound.

For $35 it’s an absolute steal.


Disclosure: As a former Netflix employee I have stock options in Netflix.

Working at Microsoft  

Ahmet Alp Balkan on the Microsoft Azure team reflected on his experiences at Microsoft. His experiences do not exactly match mine (initially on LINQ to SQL, then Entity Framework and finally but I recognize some of his points.

Here is some further discussion along with some other thoughts that have come up over the years. A lot of these don’t apply just to Microsoft and some are useful for people new to the industry to think about.


People think of Microsoft as a single entity with a sole focus and one opinion.

That’s about the worst mistake you can make.

Microsoft is like hundreds of small companies that often work together but sometimes against each other. They have different processes, dynamics, attitudes and goals not only within the same division but also within the same building or floor.

Thinking your experience with one team is a reflection of the whole company is short sighted. Microsoft employs almost 100,000 people including over 40,000 in the Redmond area alone.

It’s like a small country.

Stack of books“Expect no documentation”

Documentation can sometimes be found checked in with source code, in wikis, buried in Sharepoint sites or OneNote. Wherever it may exist it will be out of date by the time you find it.

Documentation can only be up to date if the code never changes or you have a team of incredibly rare developers who like to read and write documentation more than code. Don’t fret unless nobody has the source code.

It might appear that people are critical and dropping dead will kill the project because everything gets funnelled through one or two people but that’s not the case. Many people know more than they let on but don’t want to be involved on a day-to-day basis because they have moved onto something better. When a dire situation arises these people step up.

“Not everyone is passionate for engineering”

It’s true not everyone you meet will be interested in quality software engineering. Some people just want to get the job done and go home. That happens across and all walks of life. It’s a personal choice.

Ask yourself how many engineers you meet are passionate about delivering great experiences to users. Do they prioritize their own wants and desires such as a high test coverage in a rarely-regressed area over a simple useful feature many users are asking for.

Software engineering is a means to an end.

Your customers aren’t interested in software engineering. They want a useful tool or something entertaining.

What you want is to be able to sustain happy paying customers.

“2-3 hours of coding a day is great”

When you’re coding for yourself you are the user. You can make the decisions quickly and know what you’re asking of yourself. There is no communication overhead.

When you work with customers that slows things down especially if they’re not easy to get hold of. Most of the time you work with a project or program manager (PM in Microsoft speak) who advocates for the user. This speeds up the simpler decisions but complex or difficult decisions will still require time.

With more developers, testers and partners the communication overhead increases. You make educated guesses and perform iterative steps and keep everyone involved. If those guesses are wrong they should show up quickly. You can address those wrong guesses before too many features, code or documentation rely upon them being implemented wrongly.

If a decision can’t be easily reversed in the short term the it needs discussion. That takes time.

Two hours of coding a day can be fine. If it takes the product in the right direction.

“Not giving back to the public domain is a norm”

Whether you contribute code back to the outside world is defined by your personal goals and the team around you.

Some teams like the ones on ASP.NET MVC and Entity Framework have completely opened their stacks. Other teams have contributed back to existing projects. Your might not be able to do either… yet. Things are changing at Microsoft as these projects show and it can take patience and perseverance to make it happen.

It can be painful for a developer to break through the resistance of his own team and legal. There are reasons not to:

  • It takes time and effort to put something out for public consumption
  • It can take ongoing time and effort to maintain that code publicly
  • If your code is innovative to your business area you might be giving the competition a boost
  • Legal may perceive code contributions as a patent minefield

If your code doesn’t give you an edge then why are you writing it? Intellectual challenge? Do that on your own time. If something open source already provides important functionality you need to get permission to use that instead. Don’t give your competitors your edge while it counts.

“It’s about getting it done”

Shipping good products leads to success. Waiting for perfection leads to failure.

Shipping is everything. True, it’s not always first-to-market that wins but being late won’t help unless you have something that’s radically different. A lower bug rate or a slightly more polished experience won’t be enough.

It’s incredibly easy to ship updates today. Concentrate on getting the features usable and ensure it doesn’t harm the user. That means no corrupting data or major security issues.

All we have to decide is what to do with the time that is given to us. – Gandalf ;-)

Your product will ship with bugs. If you have a good test team you’ll know what some of them are. Fix the critical, the blockers and the high-priority as best you can. Your competition isn’t going to wait, nor are your users.

The more easily discovered or hard to work around a bug is the quicker it will be found. A hard-to-reproduce bug that’s easy to work around isn’t worth the time you already spent thinking about.

“Copy-pasting code can be okay”

Starting a shared library between teams requires an intentional co-ordinated effort.

  • When a team modifies a shared library do they know how it affects other teams? No.
  • Will the other teams be carefully monitoring the shared library? No.

Copy and pasting is fine for odd classes. You get code re-use without having to set-up merging, policies and ownership.

Fixing a critical bug in shared code always requires co-ordination between teams whether they copy and pasted the code or whether they take a shared dependency.

Bugs can hide bugs. Fixes can reveal more bugs.

“Code reviews can be skipped”

There are a few things people want to get out of a code review and how well it goes depends on the people interested in reviewing the code.

How well did I implement this feature?

We’d all love to know this but it’s the hardest thing for somebody to critique in a code review. They probably don’t know the requirements well and unless they’ve been in that area of code lately they probably don’t know what the alternatives are and why you went with this approach. To know as much as you do about implementing this feature they would likely have needed to have spent as much time on it as you.

Code reviews rarely provide good feedback in this area unless you’re new to the team – in which case you should probably have pair-programmed instead and had a better experience.

Are there any glaring bugs?

If you’re a professional you should have read your code back and forth several times and probably refactored it until it looked good. If regular bugs or code reviews point out issues then you need reviews for this. Some people are much better than this than others – it’s one of personal discipline.

You should spend far more time reading your code than you did writing it.

Did I regress performance, security or reliability

This is about the best thing you can get out of a code review. People know arcane little bits about the system that are probably not well known and tricky to document. If you’re working in code that is called all over the place go for the code review especially.

“So… can code reviews be skipped?”

I’d be lying if I said I had a code review for everything I did. Sometimes you know the code base like the back of your hand and there are plenty of checkpoints further in the process as well as other eyes constantly on the codebase. A lot of open source projects work well this way.

Never skip a code review when:

  1. You’re in a rush. That’s exactly when you need it most. Send it to multiple people and wait for 1 or 2 responses – it parallizes well.
  2. The code is used everywhere. The more callers, the more places to fail.
  3. The code accesses sensitive data. Patching after a breach is too late.

At the end of the day ask yourself “Could this code damage the reputation of the company and therefore my career?”. If the answer is YES you need a review.

Competition and stagnation

When new markets and opportunities appear it often doesn’t belong to one team and many teams can find themselves in the same space as executives go for the land-grab. This behaviour is actually encouraged at all levels in the annual reviews … “expand your influence”.

Unfortunately this often results in customer confusion, especially as products expand and subsequently overlap. LINQ to SQL and Entity Framework are my own personal experience this but I’m sure you think of plenty more.

Conversely once a market is owned by a team it can stagnate quite quickly. Microsoft Billing and the MVP/MCP portals spring to mind. The latter requires Internet Explorer only to function. In compatibility mode no less. There are more than a few Microsoft web sites looking very dated.

Be aware of what other teams are doing and how it impacts yours. Treat teams in similar spaces as potential competitors but remember that their public failures reflect on the whole company including you.

A busy whiteboardBring solutions, not problems

The article reminded me of one from a year or two back where somebody left Microsoft after a promising start that turned into a series of bad reviews after he started trying to change things by pointing out to people what’s wrong.

People know what’s wrong.

Microsoft like other big tech companies has a lot of smart people working for it. Smart people are busy.

Going around telling people that they’re doing things wrong or that things need to change without a plan is never going to make you friends or cause change. Guess what. Career progression is part popularity contest.

Worried the new site has so many hands it’s going to be a mess?
Don’t complain, do something. Figure out a solution that also solves pain for others so they’ll buy in. Work with the designers on a grid based PSD template, codify it into CSS, check it in and get it included on every page. Sacrifice a few lunchtimes to train the team on it. Get it done.

Think the approach you’re taking for security isn’t enough?
Liaise with experts, find the issues, develop or adopt libraries, tools and techniques to make the problem go away.

Get to the root of a problem and make sure the solution fits both sides

If you interface with customers directly through one of the many partner or support programs or indirectly through forums and twitter you’ll see upset customers. It’s hard, but it applies to all products. Upset people forget there are real people working hard on the product they use. That if they scream and shout they’ll get what they want. It doesn’t work that way.

You will come across good ideas, suggestions and feature requests internally and externally. Take the time to distill them down into small useful bite-sized pieces. Take from the critic’s what you can use for a better product and forget the rest.

People develop for themselves and what makes a great solution for them might not be for other people using your product.

Teams can be resistant to fully-baked solutions being handed to them. Come with bite-sized pieces and a few ideas on how they could interact. Let the solution flow out of discussion and debate. The result will be better than what you could come up with anyway.

This is even more important when dealing with other teams. They know their internals, other customers and future roadmap better than you do.

Expert means something different on the inside

Whether you’re an MVP or wrote a best-selling book joining the team behind it means you’re about to become a different type of expert.

You’re an expert on using the product. On the features that shipped. On the way it’s used.

You are about to learn is why the product is shaped that way. The hard decisions, the cut features, the implementation and constraints.

Brace your ego for impact. It doesn’t matter that you can write any kind of LINQ query off the top of your head and have used it in several apps. When you join the team behind it you’re in for a crash course in expression trees, compilers and query reduction.  How far down does the rabbit hole go?

All those great ideas and suggestions you had as a user? Be prepared to find out 99% of them aren’t original. There are reasons why they’re not there. Ideas are cheap.

It’s now your job to figure out how to make them happen. Execution matters.


Don’t get me wrong, I loved working at Microsoft. It’s an exciting place to be with so many cool things going on. Leaving was a hard decision motivated by factors not on this list.

Like any job there will be challenges. Some unique to Microsoft, some big-company specific and some near-universal that you may be experiencing for the first time if you’re new to the industry.

Learn, adapt, thrive.