Accessors come to mind:
class Foo {
int Bar { get; set }
}
Allow you to get/set the value of someFoo.Bar as if it were a public member.
If you want read- or write-only members, you just remove the "set" or "get" portion.
If at some point you need to add logic to the setter, you just do
int Bar { get; set { /* setter logic goes here */ } }
You still use assignment syntax ("someFoo.Bar = newValue"), but this syntax is desugared into a call to the setter method. Ditto for the getter.
IMHO they make class APIs much cleaner and forward-compatible (on the other hand, if you started with a public member and then need to add a proper setter with some logic, you would break the API).
Also, non-nullable types are a pretty nice way to avoid checking for null every other line of code.
And these are literally just the first couple examples that came to mind.