Risposte:
La finalparola chiave ha diversi usi in Java. Corrisponde alle parole chiave sealede sia readonlyin 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 virtualmetodo.
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 sealedparola chiave in C # solo se si desidera interrompere l'ulteriore sostituzione di un metodo che è stato esplicitamente contrassegnato virtualnella 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 readonlyparola chiave differisce da quello della constparola chiave in quanto l' readonlyespressione viene valutata in fase di esecuzione anziché in fase di compilazione , consentendo quindi espressioni arbitrarie.
readonlyle variabili membro possono essere modificate nei costruttori: pastebin.com/AzqzYGiA
Dipende dal contesto.
finalclasse o un metodo, l' equivalente in C # èsealed .finalcampo, l' equivalente in C # èreadonly .finalvariabile 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# equivalentuna grande distinzione.
constpuò 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 finalmetodi e classi.
Per il resto, è complicato.
Per i static finalcampi, 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 constmodificatore è abbastanza simile per le costanti, ma non è possibile impostarle in un costruttore statico.
readonlypuò essere utilizzato. Non è uguale però -final richiede esattamente un incarico anche nel costruttore o nell'inizializzatore.Non esiste un equivalente C # per una finalvariabile 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.