It seems that now I’ve got Lutz Roeder’s Reflector on the case with Orcas the way object initialisers work slightly different to how I expected.
As it was described to me as instantiating the object followed by the property calls. However, the compiler has taken some extra steps in there – no doubt on the grounds of safety.
First consider the following code:
// Create Robert Burns, DoB 25/Jan/1759 Person robertBurns = new Person { FirstName = "Robert", Surname = "Burns",
DateOfBirth = new DateTime(1759, 1, 25) }; Console.WriteLine("{0}", robertBurns);
As I understood the feature, the compiler should have generated code that looked like this:
Person robertBurns = new Person(); robertBurns.FirstName = "Robert"; robertBurns.Surname = "Burns"; robertBurns.DateOfBirth = new DateTime(1759, 1, 25);
However, Reflector reveals that what is actually being produced is this:
Person <>g__initLocal0 = new Person(); <>g__initLocal0.FirstName = "Robert"; <>g__initLocal0.Surname = "Burns"; <>g__initLocal0.DateOfBirth = new DateTime(0x6df, 1, 0x19); Person robertBurns = <>g__initLocal0; Console.WriteLine("{0}", robertBurns);
This actually makes some sense. For example, if my new Person object was assigned to a property of something else, or passed in as a parameter to a method it wouldn’t have the opportunity to assign values to the properties on the new object. So, it constructs it all in the background then assigns it to whatever needs it, whether that is a local variable, a property on some object a parameter in a method.
For example, if the above program is reduced to just one line of code:
// Create Robert Burns, DoB 25/Jan/1759 Console.WriteLine("{0}", new Person { FirstName = "Robert", Surname = "Burns", DateOfBirth = new DateTime(1759, 1, 25) });
The compiled result will be:
Person <>g__initLocal0 = new Person(); <>g__initLocal0.FirstName = "Robert"; <>g__initLocal0.Surname = "Burns"; <>g__initLocal0.DateOfBirth = new DateTime(0x6df, 1, 0x19); Console.WriteLine("{0}", <>g__initLocal0);
Related Posts: Object Intialisers I and II
c#
c# 3.0
.NET 3.5
Orcas
visual studio
object initialiser
object initializer
language enhancements
NOTE: This page was rescued from the Google Cache. The original date was Tuesday, 13th March, 2007
1 Comment