Risposte:
La final
parola chiave ha diversi usi in Java. Corrisponde alle parole chiave sealed
e sia readonly
in C #, a seconda del contesto in cui viene utilizzato.
Per impedire la sottoclasse (eredità dalla classe definita):
Giava
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Prevenire l'override di un virtual
metodo.
Giava
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Come sottolinea Joachim Sauer, una notevole differenza tra le due lingue qui è che Java per impostazione predefinita contrassegna tutti i metodi non statici come virtual
, mentre C # li contrassegna come sealed
. Pertanto, è necessario utilizzare la sealed
parola chiave in C # solo se si desidera interrompere l'ulteriore sostituzione di un metodo che è stato esplicitamente contrassegnato virtual
nella classe base.
Per consentire l'assegnazione di una variabile una sola volta:
Giava
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Come nota a margine, l'effetto della readonly
parola chiave differisce da quello della const
parola chiave in quanto l' readonly
espressione viene valutata in fase di esecuzione anziché in fase di compilazione , consentendo quindi espressioni arbitrarie.
readonly
le variabili membro possono essere modificate nei costruttori: pastebin.com/AzqzYGiA
Dipende dal contesto.
final
classe o un metodo, l' equivalente in C # èsealed
.final
campo, l' equivalente in C # èreadonly
.final
variabile locale o un parametro di metodo, non esiste un equivalente C # diretto.For a final local variable or method parameter, there's no direct C# equivalent
una grande distinzione.
const
può essere utilizzato solo su tipi di valore. Per quanto ne so non c'è modo di creare una costante efficace per un tipo di riferimento locale.
Ciò che manca a tutti qui è la garanzia di Java di assegnazione definita per le variabili dei membri finali.
Per una classe C con la variabile membro finale V, ogni possibile percorso di esecuzione attraverso ogni costruttore di C deve assegnare V esattamente una volta - non riuscire ad assegnare V o assegnare V due o più volte comporterà un errore.
La parola chiave readonly di C # non ha tale garanzia - il compilatore è più che felice di lasciare i membri readonly non assegnati o consentire di assegnarli più volte all'interno di un costruttore.
Quindi, final e readonly (almeno rispetto alle variabili dei membri) non sono assolutamente equivalenti - final è molto più rigoroso.
Come accennato, sealed
è un equivalente di final
metodi e classi.
Per il resto, è complicato.
Per i static final
campi, static readonly
è la cosa più vicina possibile. Ti consente di inizializzare il campo statico in un costruttore statico, che è abbastanza simile all'inizializzatore statico in Java. Questo vale sia per le costanti (primitive e oggetti immutabili) sia per i riferimenti costanti a oggetti mutabili.
Il const
modificatore è abbastanza simile per le costanti, ma non è possibile impostarle in un costruttore statico.
readonly
può essere utilizzato. Non è uguale però -final
richiede esattamente un incarico anche nel costruttore o nell'inizializzatore.Non esiste un equivalente C # per una final
variabile locale che conosco. Se ti stai chiedendo perché qualcuno dovrebbe averne bisogno: puoi dichiarare una variabile prima di un if-else, switch-case o simili. Dichiarandolo definitivo, imponi che sia assegnato al massimo una volta.
Le variabili locali Java in generale devono essere assegnate almeno una volta prima di essere lette. A meno che il ramo non salti prima della lettura del valore, una variabile finale viene assegnata esattamente una volta. Tutto questo viene verificato durante la compilazione. Ciò richiede un codice ben educato con un margine inferiore per un errore.
Riassumendo, C # non ha un equivalente diretto di final
. Mentre a Java mancano alcune belle funzionalità di C #, è rinfrescante per me come principalmente un programmatore Java vedere dove C # non riesce a fornire un equivalente.
Classe Java finale e metodo finale -> sigillato. Variabile membro Java final -> di sola lettura per la costante di runtime, const per la costante di tempo di compilazione.
Nessun equivalente per il finale della variabile locale e l'argomento del metodo final
Le costanti C # vengono dichiarate utilizzando la parola chiave const per le costanti del tempo di compilazione o la parola chiave readonly per le costanti di runtime. La semantica delle costanti è la stessa in entrambi i linguaggi C # e Java.