Nessuno, zero spaccato.
Scrivere
object.property = 10;
print(object.property)
dove "property' e' una property alla C# (NON un membro di instanza) e' ESATTAMENTE come scrivere
object.setProperty(10);
print(object.getProperty())
MA ATTENTO, c'e' anche questo:
object.property(10);
print(object.property())
Cosa cambia?
Ancora ASSOLUTAMENTE NIENTE
E' solo una questione di ""style"".
In Java ci sono diverse librerie che usano la ""reflection"" per fare le loro cose ed sfruttano questo "stile" di programmazione per decidere se un metodo e' o meno una ""proprieta"".
MA e' solo questione di ""stile"".
Ci sono librerie che permettono di ""decidere"" quale ""stile"" deve essere usato.
Poi, se vogliamo andare piu' ne' dettaglio, l'uso della ""proprieta"" (alla C#) ti permette di cambiare l'accesso DIRETTO ad membro di un oggetto in un accesso ""controllato"" SENZA cambiare il resto del codice.
Ma che comunque va ricompilato perche' anche se la sintassi SEMBRA la stessa, la semantica sottostante non lo e' piu':
prima accedevi alla struttura dati, ora devi chiamare un metodo, ma e' il compilatore che si occupa di farlo.
@Alka, non e' detto che con qualche rimaneggio/librarie di annotazioni, in qualche futuro non troppo lontano, non si possa ottenere lo stesso effetto di C#.
Gia' ora, con Lombok puoi gererare getter/setter al volo senza scrivere il codice, e lo puoi fare usando entrambi gli stili.
Inoltre, non confondere il ""concetto"" con la ""sintassi"" usata per esprimerlo.
E' un ""concetto"" che in Java e' solo ""concettuale"" (MA usato abbondantemente da librerie di terze parti cone Spring, Jersey, ed n-mila altre) ed in C# ci hanno realizzato anche una sintassi ""dedicata"".
Ma non cambia nulla.