<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Jason Crease</title><subtitle type="html">Test Engineer - Red Gate Software</subtitle><id>http://mail.simple-talk.com/community/blogs/jcrease/atom.aspx</id><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/default.aspx" /><link rel="self" type="application/atom+xml" href="http://mail.simple-talk.com/community/blogs/jcrease/atom.aspx" /><generator uri="http://communityserver.org" version="2.0.60217.2664">Community Server</generator><updated>2008-01-31T12:01:00Z</updated><entry><title>Scrum: Keeping Kosher doesn’t make you Jewish</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/12/08/70797.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/12/08/70797.aspx</id><published>2008-12-08T16:10:00Z</published><updated>2008-12-08T16:10:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;Our development team has started using Scrum.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;We’re only 4 weeks in, so it would be premature to make a judgement on whether it's working for us.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I’ve investigated how it’s practised elsewhere, and there seems to be a worrying trend…&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Let’s say I want to become a Christian.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I could go to church on Sundays; receive communion; marry in a Church; sing hymns; celebrate Christmas.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But none of these would make me a Christian.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;These are just extrinsic procedures – not core beliefs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;To really be a Christian, you have to ‘live-for-God’; believe in the divinity of Christ; and so on.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The point of Christianity is these core beliefs, not the extraneous rituals.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;When it comes to Scrum, I always see teams faithfully having daily stand-up meetings, having retrospective meetings, calling someone a Scrummaster, etc.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;But they fail to implement the core principles of Scrum: ‘Done-is-done’, etc.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;It’s easy to practise the irrelevant rituals, yet these should not be confused with what Scrum is really about.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Many people tell me that no one implements Scrum properly – it’s a matter of compromise and seeing what works.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I don't accept this.&amp;nbsp; It’s remarkable how readily people compromise on the core-beliefs, yet retain all the extraneous procedures.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;They give up believing Jesus is the son of God, but keep Easter.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;This is not to say there isn’t value in some of Scrum.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Daily stand-up meetings are useful; but this hardly amounts to a vindication of Scrum.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In the same way, some hymns are great (‘Autumn Days’ and ‘Shine Jesus Shine’ are two of my favourites) but this is not sufficient to justify becoming a Christian.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;If you like hymns but don’t believe in the divinity of Christ, then don’t become a Christian.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Start a choir instead.&lt;/P&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=70797" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>Nullable Structs - An interesting 'Gotcha'</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/11/26/70653.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/11/26/70653.aspx</id><published>2008-11-26T17:11:00Z</published><updated>2008-11-26T17:11:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;SPAN&gt;One of the interesting new features in C# 2.0 was nullable valuetypes.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Using these, you can set valuetypes to a value, or null.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Their usage is entirely straightforward.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;For instance, to use a nullable int simply declare a variable of type int?, and then set it to a value or null.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Behind the scenes, nullable valuetypes are implemented as generic structs of type Nullable&amp;lt;T&amp;gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;When you write:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt;? i = 2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;What you’re really writing is:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Nullable&lt;/SPAN&gt;&amp;lt;&lt;SPAN&gt;int&lt;/SPAN&gt;&amp;gt; i = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Nullable&lt;/SPAN&gt;&amp;lt;&lt;SPAN&gt;int&lt;/SPAN&gt;&amp;gt;(2);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;When you assign a value to a pre-existing nullable int, like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;i = 4;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;you’re really writing:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;i = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Nullable&lt;/SPAN&gt;&amp;lt;&lt;SPAN&gt;int&lt;/SPAN&gt;&amp;gt;(4);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;And when you ‘get’ the value, like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt; j = i;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;What you’re really writing is:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt; j = i.Value;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;The Value is a get property, and assignment is by creating a new instance of Nullable&amp;lt;T&amp;gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is similar to strings in C#: presenting a reference type by valuetype semantics.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;This is all fine for primitives like int, double, etc. But when using structs, an interesting problem is created that lets light in on the ‘magic’ of nullable valuetypes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Let’s say I have a struct Point, implemented as so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;struct&lt;/SPAN&gt; &lt;SPAN&gt;Point&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;int&lt;/SPAN&gt; x, y;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt; Point(&lt;SPAN&gt;int&lt;/SPAN&gt; px, &lt;SPAN&gt;int&lt;/SPAN&gt; py)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;x = px; y = py;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;override&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; ToString()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"("&lt;/SPAN&gt; + x + &lt;SPAN&gt;", "&lt;/SPAN&gt; + y + &lt;SPAN&gt;")"&lt;/SPAN&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Then, I write a program that creates an int and a Point, and alter them slightly:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Main(&lt;SPAN&gt;string&lt;/SPAN&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt; i = 3;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(++i);&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//increment then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Point&lt;/SPAN&gt; p = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Point&lt;/SPAN&gt;(2, 4);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;p.x = 1; &lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(p);&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//move left then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.ReadLine();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;No problems here.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The int and the Point will be altered as expected. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Now I decide that I want my int and Point to be nullable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So I simply add two question marks, producing this program:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Main(&lt;SPAN&gt;string&lt;/SPAN&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt;? i = 3;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(++i);&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//increment then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Point&lt;/SPAN&gt;? p = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Point&lt;/SPAN&gt;(2, 4);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;p.x = 1; &lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(p);&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//move left then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.ReadLine();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;But this won’t compile.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The int? part is fine, but for the Point? part I get the error: &lt;I&gt;“'System.Nullable&amp;lt; Point&amp;gt;' does not contain a definition for 'x'”&lt;/I&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;No problem, I’ll just edit it like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Main(&lt;SPAN&gt;string&lt;/SPAN&gt;[] args)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;int&lt;/SPAN&gt;? i = 3;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(++i);&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//increment then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Point&lt;/SPAN&gt;? p = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Point&lt;/SPAN&gt;(2, 4);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;p. Value.x = 1; &lt;SPAN&gt;Console&lt;/SPAN&gt;.WriteLine(p);&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;//move left then print it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Console&lt;/SPAN&gt;.ReadLine();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Now you get a different compile error: &lt;I&gt;“Cannot modify the return value of 'System.Nullable&amp;lt;.Point&amp;gt;.Value' because it is not a variable”&lt;/I&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This happens because Nullable&amp;lt;T&amp;gt;.Value has no set accessor method.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Nullable value types have this ‘limitation’ for a very good reason.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;The same thing happens is you try to edit a struct in a List&amp;lt;&amp;gt; of structs.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Consider an over-simplification of Nullable&amp;lt;T&amp;gt; with a bodged-in set accessor, like so:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;MyNullable&lt;/SPAN&gt;&amp;lt;T&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;private&lt;/SPAN&gt; T val;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;public&lt;/SPAN&gt; T Value&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;set&lt;/SPAN&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;val = &lt;SPAN&gt;value&lt;/SPAN&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;get&lt;/SPAN&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt; val;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;If I create a &lt;/SPAN&gt;&lt;SPAN&gt;MyNullable&lt;/SPAN&gt;&lt;SPAN&gt;&amp;lt;&lt;SPAN&gt;Point&lt;/SPAN&gt;&amp;gt; &lt;/SPAN&gt;&lt;SPAN&gt;and use it:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;MyNullable&lt;/SPAN&gt;&amp;lt;&lt;SPAN&gt;Point&lt;/SPAN&gt;&amp;gt; p = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;MyNullable&lt;/SPAN&gt;&amp;lt;&lt;SPAN&gt;Point&lt;/SPAN&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;p.Value = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Point&lt;/SPAN&gt;(2, 1);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;p.Value.x = 2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;I get a compile error on the third line: &lt;I&gt;“Cannot modify the return value of ‘MyNullable&amp;lt;Point&amp;gt;.Value' because it is not a variable”.&lt;/I&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;This is because the statement &lt;/SPAN&gt;&lt;SPAN&gt;p.Value.x = 2&lt;FONT face="Times New Roman"&gt; is equivilent to:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;FONT face="Times New Roman"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;Point&lt;/SPAN&gt; otherPoint = p.Value; otherPoint.x = 2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;Which doesn’t change the underlying p.val, because otherPoint is a &lt;B&gt;&lt;I&gt;copy&lt;/I&gt;&lt;/B&gt; of p.Val.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;So when C# gives us a compile error, it is merely protecting us from editing an irrelevent copy of the underlying Point.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;In conclusion, nullable valuetypes are immutable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;I think the C# designers intended programmers to never modify the value of a struct once one is created, nullable or not.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=70653" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>Testing the speed of ANTS Profiler 4</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/09/16/69546.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/09/16/69546.aspx</id><published>2008-09-16T13:55:00Z</published><updated>2008-09-16T13:55:00Z</updated><content type="html">&lt;P&gt;Profiling and debugging code inevitably adds overhead, and I know that it can be really frustrating. The overhead can either be small, e.g. the Visual Studio debugger, or massive, as with most performance profilers. A developer may invest in a performance profiler to optimize an algorithm that takes 10 minutes to run, and finds that when profiled it takes 2 hours to run. A top priority in the development of ANTS Profiler 4 was to make it faster than its predecessor and faster than any other profiler on the market.&lt;/P&gt;
&lt;P&gt;We have found ANTS Profiler 4 to be about eight times faster than its predecessor, ANTS Profiler 3. It is also 4 to 20 times faster at line-level profiling than other profilers on the market.&lt;/P&gt;
&lt;P&gt;I did a few speed tests and I have made a video to show how ANTS Profiler 4 compares to the fastest-known other profiler: &lt;/P&gt;
&lt;P&gt;&lt;A href="/blogbits/Jason_Crease/ANTS4/ANTS4_vs_Competitor/ANTS4_vs_Competitor.html" target=_blank&gt;ANTS Profiler 4 vs fastest known competitor&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Here it is compared to ANTS Profiler 3: &lt;/P&gt;
&lt;P&gt;&lt;A href="/blogbits/Jason_Crease/ANTS4/ANTS4_vs_ANTS3/ANTS4_vs_ANTS3.html" target=_blank&gt;ANTS Profiler 4 vs ANTS Profiler 3&lt;/A&gt; &lt;/P&gt;If you want to try out ANTS Profiler 4, you can download it from the &lt;A href="http://www.red-gate.com/products/ants_profiler/index.htm?utm_source=simpletalk&amp;amp;utm_medium=blog&amp;amp;utm_content=jason-testingspeedap4&amp;amp;utm_campaign=antsprofiler" target=_blank&gt;RedGate website&lt;/A&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=69546" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>A Quick .NET Puzzle</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/07/17/62701.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/07/17/62701.aspx</id><published>2008-07-17T17:17:00Z</published><updated>2008-07-17T17:17:00Z</updated><content type="html">&lt;P&gt;&lt;CODE&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;SPAN&gt;&lt;FONT face=Arial&gt;Just&amp;nbsp;a quick&amp;nbsp;.NET puzzle.&amp;nbsp; Does this application ever throw that ApplicationException?&amp;nbsp; If so, why?&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;SPAN&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;CODE&gt;&lt;SPAN&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN&gt;using &lt;/SPAN&gt;&lt;SPAN&gt;System&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN&gt;using &lt;/SPAN&gt;&lt;SPAN&gt;System.Threading&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;&lt;SPAN&gt;Program&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;static long &lt;/SPAN&gt;&lt;SPAN&gt;Num &lt;/SPAN&gt;&lt;SPAN&gt;= &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;static void &lt;/SPAN&gt;&lt;SPAN&gt;Main&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;string&lt;/SPAN&gt;&lt;SPAN&gt;[] args&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread t1 &lt;/SPAN&gt;&lt;SPAN&gt;= new &lt;/SPAN&gt;&lt;SPAN&gt;Thread&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;ModifyNum&lt;/SPAN&gt;&lt;SPAN&gt;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;t1.Start&lt;/SPAN&gt;&lt;SPAN&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;while &lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;true&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;long &lt;/SPAN&gt;&lt;SPAN&gt;k &lt;/SPAN&gt;&lt;SPAN&gt;= &lt;/SPAN&gt;&lt;SPAN&gt;Num&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;k &lt;/SPAN&gt;&lt;SPAN&gt;!= -&lt;/SPAN&gt;&lt;SPAN&gt;1&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;amp;&amp;amp;&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN&gt;k &lt;/SPAN&gt;&lt;SPAN&gt;!= &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;throw new &lt;/SPAN&gt;&lt;SPAN&gt;ApplicationException&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;"k is not -1 or 0.&amp;nbsp;&amp;nbsp;It is " &lt;/SPAN&gt;&lt;SPAN&gt;+ &lt;/SPAN&gt;&lt;SPAN&gt;k.ToString&lt;/SPAN&gt;&lt;SPAN&gt;());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;static void &lt;/SPAN&gt;&lt;SPAN&gt;ModifyNum&lt;/SPAN&gt;&lt;SPAN&gt;()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while &lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;true&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;if &lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;Num &lt;/SPAN&gt;&lt;SPAN&gt;== &lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;) &lt;/SPAN&gt;&lt;SPAN&gt;Num &lt;/SPAN&gt;&lt;SPAN&gt;= &lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;else &lt;/SPAN&gt;&lt;SPAN&gt;Num &lt;/SPAN&gt;&lt;SPAN&gt;= &lt;/SPAN&gt;&lt;SPAN&gt;-&lt;/SPAN&gt;&lt;SPAN&gt;1&lt;/SPAN&gt;&lt;SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&lt;CODE&gt;&lt;SPAN&gt;&lt;FONT face=Arial&gt;Stuck?&amp;nbsp; Then h&lt;SPAN&gt;ere's a hint: if you change&amp;nbsp;Num from a long to an int, it never throws the exception.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=62701" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>ANTS Performance Profiler 4 = Sexy Software!?</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/06/03/58172.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/06/03/58172.aspx</id><published>2008-06-03T16:46:00Z</published><updated>2008-06-03T16:46:00Z</updated><content type="html">&lt;P&gt;I sit next to this guy called Stephen Chambers. He is the Usability Engineer working on our next version of our code profiler, ANTS Performance Profiler 4. He is completely revising the UI of ANTS Profiler, and spends most of his time phoning developers asking what they would like to see in the next version, and then designing the new UI based on the feedback he gets.&lt;/P&gt;
&lt;P&gt;Occasionally, you’ll hear some outbursts such as: “It’s getting hotter and hotter round heeere!” If you ask him what he’s on about, he’ll reply in an apologetic tone, “I can’t help it…. It really is very sexy!” That’s when I realise he’s talking about ANTS Performance Profiler 4 (APP 4) and the new design he’s working on. He’s contemplating the slick interface and clean lines of the profiler, summoning passers-by to come and check out “How god damn sexy it looks!”&lt;/P&gt;
&lt;P&gt;So, the other day I asked for more detail. What exactly makes Stephen so animated? &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1. One-click profiling&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;He loves the one-click profiling concept. He spent a lot of time working on the opening dialog. No 52-step wizards - just a single screen. The opening dialog is implemented to allow immediate profiling. That way, users will be more inclined to use the tool a lot more frequently, because it’s so quick and easy. &lt;/P&gt;
&lt;P&gt;&lt;IMG src="/blogbits/tonyd/Jcrease//SexyPANTS_image001.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Figure 1: Opening Dialog of ANTS Performance Profiler 4&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Much greater control for the user&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;The decision to remove the concept of ‘snapshots’ has produced an entirely new way of interacting with the profiler. Why confine the user to ‘snapshots’ when he could just choose any arbitrary period of time? Simply highlight any period of time (e.g. the creation of a Form), and see profiling results for that period. &lt;/P&gt;
&lt;P&gt;&lt;IMG src="/blogbits/tonyd/Jcrease//SexyPANTS_image002.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Figure 2: Timeline feature in ANTS Performance Profiler 4&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;With snapshots, you must remember to switch back to the profiler to take a snapshot, reset results, etc. The need to switch from a task to the profiler has now been removed. The user can perform any number of actions they wish and retrospectively analyze the performance of each task in as much depth as they wish. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Responsiveness of the interface&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Stephen has so far organised over 15 hours of testing sessions with users of the Early Access Program of APP 4. I asked him about their feedback. It seems that participants to the usability sessions have been stunned by the speed at which the results for a given region are processed and displayed. This can equally be done while the profiled application is running or after it has exited. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;4. Clear and simple interface&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Given the inherent complications of performance profiling, creating a front end that keeps things simple and immediate was a priority for Stephen. The UI went through several iterations and one of the main achievements of the APP 4 development team has been the reduction of options and windows on the main UI. Stephen seems to be getting a satisfying feeling watching a participant in a feedback session of APP 4 install it, set-up a project to be profiled and locate a performance bottleneck within minutes. The power of the profiler is as it should be – hidden under the surface with just the right number of options at the right time to give the user the power to examine the data in any way they feel like. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. Not throwing the baby out with the bathwater&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Talking to existing users of ANTS Profiler 3 revealed a huge amount about not only what features people would like to see in a new version but also what they really liked about the existing version. ANTS Profiler is well-known for its slick line-level timings feature, and some were concerned a new versions may present a ‘change for the worse’. APP 4 represents innovation in many areas, but preserves the features that people found genuinely useful in ANTS Profiler 3. We originally considered dropping the ‘All Methods Grid’, but this decision was quickly reversed upon talking to customers. Instead of a removal or total re-design, a number of subtle tweaks were made to simply freshen up its appearance and extend its usefulness. For example performance bars were added to heighten the visibility of poorly performing methods. 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG src="/blogbits/tonyd/Jcrease//SexyPANTS_image003.jpg"&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Figure 3: The fresher ‘All Methods’ grid in ANTS Performance Profiler 4&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;The code view has retained the iconic &lt;A href="http://www.red-gate.com/products/ants_profiler/index.htm" target=_blank&gt;ANTS Profiler 3&lt;/A&gt; red bars but we have tweaked its functionality by showing the currently selected method.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I find Stephen’s passion for his work impressive. He gets amazing satisfaction from watching users understand the features and options available, and listening to users saying “oh wow, that’s what I call a responsive profiler!” or “very clean interface!” Admittedly, a lot of work went into these things, so I guess, I can understand that…but I can’t help feeling a little uneasy when I see Stephen dancing on his chair, singing “ANTS Performance Profiler, Sexy Software…”! &lt;/P&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=58172" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>Order of Construction</title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/06/02/57964.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/06/02/57964.aspx</id><published>2008-06-02T15:05:00Z</published><updated>2008-06-02T15:05:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;B&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;For me, inheritance is often a headache.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In particular, in what order is everything initialized?&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Consider this short C# program. &lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;It creates an instance of &lt;SPAN&gt;Dog&lt;/SPAN&gt;, which derives from &lt;SPAN&gt;Animal&lt;/SPAN&gt;.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Both &lt;SPAN&gt;Dog&lt;/SPAN&gt; and &lt;SPAN&gt;Animal&lt;/SPAN&gt; have an instance constructor, a class initializer (aka a static constructor), an instance variable, and a static variable.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT color=blue&gt;using&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;System&lt;/FONT&gt;&lt;FONT color=gray&gt;;
&lt;BR&gt;
&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=blue&gt;namespace&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;CtorOrder
&lt;BR&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;class&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Animal
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;int&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;instanceAnimal&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;=&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Program.Print&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Animal.instanceAnimal"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;static&amp;nbsp;int&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;staticAnimal&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;=&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Program.Print&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Animal.staticAnimal"&lt;/FONT&gt;&lt;FONT color=gray&gt;);&lt;/FONT&gt;&lt;FONT color=gray&gt;
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Animal&lt;/FONT&gt;&lt;FONT color=gray&gt;()
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Animal&amp;nbsp;constructor"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;static&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Animal&lt;/FONT&gt;&lt;FONT color=gray&gt;()
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Animal&amp;nbsp;class&amp;nbsp;constructor"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;class&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Dog&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=gray&gt;:&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Animal
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;int&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;instanceDog&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;=&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Program.Print&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Dog.instanceDog"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;static&amp;nbsp;int&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;staticDog&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;=&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Program.Print&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Dog.staticDog"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Dog&lt;/FONT&gt;&lt;FONT color=gray&gt;()
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Dog&amp;nbsp;constructor"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;static&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Dog&lt;/FONT&gt;&lt;FONT color=gray&gt;()
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"Dog&amp;nbsp;class&amp;nbsp;constructor"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;BR&gt;&amp;nbsp;
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;class&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Program
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;public&amp;nbsp;static&amp;nbsp;int&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Print&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=blue&gt;string&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;s&lt;/FONT&gt;&lt;FONT color=gray&gt;)
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=black&gt;s&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;return&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;0&lt;/FONT&gt;&lt;FONT color=gray&gt;;
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;static&amp;nbsp;void&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Main&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=blue&gt;string&lt;/FONT&gt;&lt;FONT color=black&gt;[]&amp;nbsp;args&lt;/FONT&gt;&lt;FONT color=gray&gt;)
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;{
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dog&amp;nbsp;d&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=blue&gt;=&amp;nbsp;new&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Dog&lt;/FONT&gt;&lt;FONT color=gray&gt;();
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Console.WriteLine&lt;/FONT&gt;&lt;FONT color=gray&gt;(&lt;/FONT&gt;&lt;FONT color=darkred&gt;"\nPress&amp;nbsp;enter&amp;nbsp;to&amp;nbsp;continue"&lt;/FONT&gt;&lt;FONT color=gray&gt;);
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;Console.ReadLine&lt;/FONT&gt;&lt;FONT color=gray&gt;();
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=black&gt;}
&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;BR&gt;}&lt;/FONT&gt;&lt;FONT color=black&gt;
&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P class=MsoNormal&gt;There are eight activities here: &lt;/P&gt;
&lt;OL&gt;
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; instance constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; class constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; instance variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; static variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; instance constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; class constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; instance variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; static variable&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal&gt;The question is: ‘In what order are the eight activities run?’&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Try working it out.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Anyway, the answer is:&lt;/P&gt;
&lt;OL&gt;
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; static variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; class constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; instance variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; static variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; class constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt; instance variable 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Animal&lt;/SPAN&gt;&amp;nbsp;instance constructor 
&lt;LI class=MsoNormal&gt;&lt;SPAN&gt;Dog&lt;/SPAN&gt; instance constructor&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal&gt;There are two things I find surprising about this:&lt;/P&gt;
&lt;OL&gt;
&lt;LI class=MsoNormal&gt;Why do static constructors run from most derived class to least derived class, i.e. &lt;SPAN&gt;Dog&lt;/SPAN&gt; then &lt;SPAN&gt;Animal&lt;/SPAN&gt;? 
&lt;LI class=MsoNormal&gt;Why do instance variables get initialized before calling the parent’s instance constructor?&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal&gt;The answer to question 1 is that Dog’s class initializer has to be run since we are running Dog’s instance constructor, but &lt;EM&gt;&lt;SPAN&gt;execution of any type's class initializer method will not trigger automatic execution of any class initializer methods defined by its base type.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Indeed, why should it?&lt;/SPAN&gt;&lt;/EM&gt;&lt;I&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The answer to question 2 is complicated.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Constructing instance fields in the most derived class first is the only way to ensure that readonly fields are initialized and then not changed.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Check out Eric Lippert’s blog for a decent explanation: &lt;A href="http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx"&gt;&lt;FONT color=#800080&gt;http://blogs.msdn.com/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=57964" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry><entry><title>Using the Exception Hunter Command Line to find All Methods that throw a given Exception </title><link rel="alternate" type="text/html" href="http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/01/31/45719.aspx" /><id>http://mail.simple-talk.com/community/blogs/jcrease/archive/2008/01/31/45719.aspx</id><published>2008-01-31T12:01:00Z</published><updated>2008-01-31T12:01:00Z</updated><content type="html">&lt;P&gt;Red-Gate's new .NET tool - Exception Hunter - shows you the exceptions that can be thrown by a .NET method. However, many users would like to see this the other way round, i.e. pick an exception and see which methods throw that exception. We will endeavour to put this in the next version of Exception Hunter. &lt;/P&gt;
&lt;P&gt;However, for the moment this functionality is available via the Exception Hunter command line. I've recorded a 5-minute video where I demonstrate how to use the command-line to find all methods that throw IO exceptions in a simple application. Have a look... &lt;/P&gt;
&lt;P&gt;&lt;A href="/blogbits/jason_crease/Exception_Hunter_Command_Line_demo_skin.swf"&gt;http://www.simple-talk.com/blogbits/jason_crease/Exception_Hunter_Command_Line_demo_skin.swf&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;To download the 14-day free-trial of the .NET Developer Bundle, which includes Exception Hunter, go to: &lt;/P&gt;
&lt;P&gt;&lt;A href="https://www.red-gate.com/dynamic/downloads/downloadform.aspx?download=exceptionhunter"&gt;Download .NET Developer Bundle&lt;/A&gt;&lt;/P&gt;&lt;img src="http://mail.simple-talk.com/community/aggbug.aspx?PostID=45719" width="1" height="1"&gt;</content><author><name>Jason Crease</name><uri>http://mail.simple-talk.com/community/user/Profile.aspx?UserID=5874</uri></author></entry></feed>