Qual é o equivalente do Java final
em C #?
c#
access-modifiers
reserved-words
Nosrama
fonte
fonte
Respostas:
A
final
palavra-chave tem vários usos em Java. Corresponde às palavrassealed
-readonly
chave e em C #, dependendo do contexto em que é usada.Aulas
Para impedir a subclassificação (herança da classe definida):
Java
C #
Métodos
Impedir a substituição de um
virtual
método.Java
C #
Como Joachim Sauer aponta, uma diferença notável entre as duas linguagens aqui é que Java, por padrão, marca todos os métodos não estáticos como
virtual
, enquanto C # os marca comosealed
. Portanto, você só precisa usar asealed
palavra - chave em C # se desejar interromper a substituição de um método que foi explicitamente marcadovirtual
na classe base.Variáveis
Para permitir que uma variável seja atribuída apenas uma vez:
Java
C #
Como observação lateral, o efeito da
readonly
palavra - chave difere do efeito da palavra-const
chave, pois areadonly
expressão é avaliada em tempo de execução, em vez de em tempo de compilação , permitindo expressões arbitrárias.fonte
readonly
variáveis de membro podem ser modificadas em construtores: pastebin.com/AzqzYGiADepende do contexto.
final
classe ou método, o equivalente em C # ésealed
.final
campo, o equivalente em C # éreadonly
.final
variável local ou parâmetro de método, não há equivalente C # direto.fonte
For a final local variable or method parameter, there's no direct C# equivalent
uma enorme distinção.const
só pode ser usado em tipos de valor. Tanto quanto sei, não há como fazer uma constante efetiva para um tipo de referência local.O que todo mundo está perdendo é a garantia de Java de atribuição definitiva para variáveis de membro final.
Para uma classe C com variável de membro final V, todo caminho de execução possível através de cada construtor de C deve atribuir V exatamente uma vez - deixar de atribuir V ou atribuir V duas ou mais vezes resultará em erro.
A palavra-chave readonly do C # não tem essa garantia - o compilador fica mais do que feliz em deixar os membros readonly não atribuídos ou permitir que você os atribua várias vezes em um construtor.
Portanto, final e somente leitura (pelo menos em relação às variáveis-membro) definitivamente não são equivalentes - final é muito mais rigoroso.
fonte
Como mencionado,
sealed
é equivalentefinal
a métodos e classes.Quanto ao resto, é complicado.
Para
static final
campos,static readonly
é a coisa mais próxima possível. Ele permite que você inicialize o campo estático em um construtor estático, que é bastante semelhante ao inicializador estático em Java. Isso se aplica a constantes (objetos primitivos e imutáveis) e a referências constantes a objetos mutáveis.O
const
modificador é bastante semelhante para constantes, mas você não pode defini-las em um construtor estático.readonly
pode ser usado. Porém, não é igual -final
requer exatamente uma atribuição, mesmo no construtor ou inicializador.Não há C # equivalente para uma
final
variável local que eu conheça. Se você está se perguntando por que alguém precisaria dela: é possível declarar uma variável antes de um if-else, caso de mudança ou mais. Ao declarar final, você aplica que ele seja atribuído no máximo uma vez.As variáveis locais Java em geral devem ser designadas pelo menos uma vez antes de serem lidas. A menos que o ramo salte antes da leitura do valor, uma variável final é atribuída exatamente uma vez. Tudo isso é verificado em tempo de compilação. Isso requer um código bem comportado com menos margem para um erro.
Resumindo, o C # não tem equivalente direto de
final
. Embora o Java não tenha alguns recursos interessantes do C #, é refrescante para mim, como programador Java, ver onde o C # falha em fornecer um equivalente.fonte
Final da classe Java e método final -> selado. Variável de membro Java final -> somente leitura para constante de tempo de execução, const para constante de tempo de compilação.
Sem equivalente para variável local final e argumento de método final
fonte
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
As constantes C # são declaradas usando a palavra-chave const para constantes de tempo de compilação ou a palavra-chave readonly para constantes de tempo de execução. A semântica das constantes é a mesma nas linguagens C # e Java.
fonte
selado
fonte