AFAIK they behave exactly the same.
No they don't.
- Fields can't be used in data binding (at least in some binding implementations)
- You can add more logic later for properties without breaking source or binary compatibility
- Properties can't be passed by reference
- You can't add an initializer to an automatically implemented property
- They'll clearly be different in terms of reflection
- Philosophically, properties are logically part of the API whereas fields are an implementation detail
in c# you can always rewrite Foo into this: [...]
Well you can if you don't care about binary or source compatibility, yes. In some cases that's really not an issue - in other cases it's very, very much an issue. Why not make the choice to expose your API rather than your implementation details from the start? It's not like adding { get; set; }
in your code is adding much clutter...
For more ranting, see my article on this.