Is a readonly field in C# thread safe?

Yes - your code doesn't expose this within either constructor, so no other code can "see" the object before it's been fully constructed. The .NET memory model (as of .NET 2) includes a write barrier at the end of every constructor (IIRC - search Joe Duffy's blog posts for more details) so there's no risk of another thread seeing a "stale" value, as far as I'm aware.

I'd personally still usually use a property instead, as a way of separating implementation from API, but from a thread-safety point of view it's fine.


That depends what's in the field.

Reading from a readonly field, or from any field that is smaller than the word length (including all reference types) is an atomic operation.

However, the object inside the readonly field may or may not be thread-safe.