Wat is het equivalent van Java’s final
in C#?
Antwoord 1, autoriteit 100%
Het final
zoekwoord heeft verschillende toepassingen op Java. Het komt overeen met zowel de sealed
en readonly
-zoekwoorden in C#, afhankelijk van de context waarin het wordt gebruikt.
Klassen
Om subklassen te voorkomen (overerving van de gedefinieerde klasse):
Java
public final class MyFinalClass {...}
C#
public sealed class MyFinalClass {...}
Methoden
Voorkom het negeren van een virtual
methode.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Zoals Joachim Sauer opmerkt, is een opmerkelijk verschil tussen de twee talen hier dat Java standaard alle niet-statische methoden markeert als virtual
, terwijl C# ze markeert als sealed
. Daarom hoeft u alleen het trefwoord sealed
in C# te gebruiken als u wilt stoppen met het verder overschrijven van een methode die expliciet is gemarkeerd als virtual
in de basisklasse.
Variabelen
Om een variabele slechts één keer toe te wijzen:
Java
public final double pi = 3.14; // essentially a constant
C#
public readonly double pi = 3.14; // essentially a constant
Als een kanttekening, het effect van het readonly
zoekwoord verschilt van dat van de const
sleutelwoord in die zin dat de readonly
expressie wordt geëvalueerd tijdens runtimein plaats van compileren -time, waardoor willekeurige uitdrukkingen worden toegestaan.
Antwoord 2, autoriteit 22%
Het hangt af van de context.
- Voor een
final
klasse of methode, de C# equivalent issealed
. - Voor een
final
-veld is het C#-equivalentreadonly
. - Voor een
final
lokale variabele of methodeparameter is er geen direct C#-equivalent.
Antwoord 3, autoriteit 5%
Wat iedereen hier mist, is Java’s garantie van definitieve toewijzing voor variabelen van het laatste lid.
Voor een klasse C met een laatste lidvariabele V, moet elk mogelijk uitvoeringspad door elke constructor van C V precies één keer toewijzen – als V niet wordt toegewezen of als V twee of meer keer wordt toegewezen, resulteert dit in een fout.
Het alleen-lezen-zoekwoord van C# heeft zo’n garantie niet – de compiler laat graag alleen-lezen leden niet-toegewezen of staat u toe om ze meerdere keren toe te wijzen binnen een constructor.
Dus, definitief en alleen-lezen (tenminste met betrekking tot lidvariabelen) zijn absoluut niet gelijkwaardig – definitief is veel strenger.
Antwoord 4
Zoals vermeld, is sealed
een equivalent van final
voor methoden en klassen.
Voor de rest is het ingewikkeld.
-
Voor
static final
-velden komtstatic readonly
het dichtst in de buurt. Hiermee kunt u het statische veld initialiseren in een statische constructor, die redelijk lijkt op de statische initialisatie in Java. Dit geldt zowel voor constanten (primitieven en onveranderlijke objecten) als constante verwijzingen naar veranderlijke objecten.De modifier
const
lijkt redelijk op constanten, maar je kunt ze niet in een statische constructor instellen. -
Op een veld dat niet opnieuw moet worden toegewezen zodra het de constructor verlaat, kan
readonly
worden gebruikt. Het is echter niet gelijk –final
vereist precies één toewijzing, zelfs in constructor of initializer. -
Er is geen C#-equivalent voor een
final
lokale variabele die ik ken. Als je je afvraagt waarom iemand het nodig heeft: je kunt een variabele declareren voorafgaand aan een if-else, switch-caseof zo. Door het definitief te verklaren, dwing je af dat het maximaal één keer is toegewezen.Java-lokale variabelen moeten in het algemeen minstens één keer worden toegewezen voordat ze worden gelezen. Tenzij de vertakking eruit springt voordat de waarde wordt gelezen, wordt een laatste variabele precies één keer toegewezen. Dit alles wordt tijdens het compileren gecontroleerd. Dit vereist goed gedragen code met minder marge voor fouten.
Samengevat heeft C# geen direct equivalent van final
. Hoewel Java een aantal leuke functies van C# mist, is het verfrissend voor mij als meestal een Java-programmeur om te zien waar C# er niet in slaagt een equivalent te leveren.
Antwoord 5
Java klasse finale en methode finale -> verzegeld.
Java-lidvariabele definitief -> alleen-lezen voor runtimeconstante, const voor compileertijdconstante.
Geen equivalent voor definitieve lokale variabele en methode-argument definitief
Antwoord 6
verzegeld