I was perplexed after executing this piece of code, where strings seems to behave as if they are value types. I am wondering whether the assignment operator is operating on
You're not changing anything about the object a1 points to, but instead changing which object a1 points to.
(source: morethannothing.co.uk)
Your example replaces "new Person { … }" with a string literal, but the principle is the same.
The difference comes when you're changing properties of the object. Change the property of a value type, and it's not reflected in the original.
(source: morethannothing.co.uk)
Change the property of a reference type, and it is reflected in the original.
p.s. Sorry about the size of the images, they're just from something I had lying around. You can see the full set at http://dev.morethannothing.co.uk/valuevsreference/, which covers value types, reference types, and passing value types by value and by reference, and passing reference types by value and by reference.