Stai fondamentalmente fraintendendo il significato di entrambe le definizioni. Solo esporre il getter dice niente sul fatto che un valore sia o meno di sola lettura.
Mentre in questo esempio banale:
public class GetOnly
{
public string MyProp { get; }
}
possiamo dire che sarà MyProp
mai cambiare il suo valore, non possiamo dire sempre che una proprietà getter-solo non avrà cambiato il suo valore. Un esempio di ciò è una situazione in cui noi non è possibile vedere l'implementazione di GetOnly
e conoscere solo la definizione pubblica - Ad esempio, se si stesse lavorando con una libreria di terze parti a codice chiuso.
Un esempio più chiaro è questo:
public interface ISomething
{
string MyProp { get; }
}
Questa interfaccia non dice che MyProp
è di sola lettura. Si dice che si non è possibile modificare la proprietà. Non dice nulla sul comportamento della proprietà. Ancora peggio, dice solo che non è possibile modificare la proprietà quando si esegue espressamente il casting come ISomething
.
E 'tutto possibile implementare l'interfaccia in questo modo (anche se l'interfaccia espone solo il getter):
public class GetOnly : ISomething
{
public string MyProp { get; set; }
}
readonly
è un modificatore che rafforza in modo esplicito il fatto che il valore non cambierà mai , tranne nella dichiarazione o nel costruttore (salvo soluzioni alternative come reflection).
Tuttavia, readonly
non può funzionare sulle proprietà, poiché le proprietà sono semplicemente zucchero sintattico per ottenere/impostare metodi . Inoltre, le interfacce definiscono solo i metodi e pertanto non è possibile definire campi (e per estensione, campi readonly).
Quindi per rispondere alla tua risposta: Sì, sono mondi a parte, e sono solo simili in superficie.
È possibile implementare l'interfaccia sulla classe ReadOnly con un'implementazione esplicita –