Wat is het equivalent van Java’s finale in C#?

Wat is het equivalent van Java’s finalin C#?


Antwoord 1, autoriteit 100%

Het finalzoekwoord heeft verschillende toepassingen op Java. Het komt overeen met zowel de sealeden 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 virtualmethode.

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 sealedin C# te gebruiken als u wilt stoppen met het verder overschrijven van een methode die expliciet is gemarkeerd als virtualin 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 readonlyzoekwoord verschilt van dat van de constsleutelwoord in die zin dat de readonlyexpressie wordt geëvalueerd tijdens runtimein plaats van compileren -time, waardoor willekeurige uitdrukkingen worden toegestaan.


Antwoord 2, autoriteit 22%

Het hangt af van de context.


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 sealedeen equivalent van finalvoor methoden en klassen.

Voor de rest is het ingewikkeld.

  • Voor static final-velden komt static readonlyhet 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 constlijkt 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 readonlyworden gebruikt. Het is echter niet gelijk – finalvereist precies één toewijzing, zelfs in constructor of initializer.

  • Er is geen C#-equivalent voor een finallokale 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

Other episodes