Search code examples
c#access-modifiersreserved-words

What is the equivalent of Java's final in C#?


What is the equivalent of Java's final in C#?


Solution

  • The final keyword has several usages in Java. It corresponds to both the sealed and readonly keywords in C#, depending on the context in which it is used.

    Classes

    To prevent subclassing (inheritance from the defined class):

    Java

    public final class MyFinalClass {...}
    

    C#

    public sealed class MyFinalClass {...}
    

    Methods

    Prevent overriding of a virtual method.

    Java

    public class MyClass
    {
        public final void myFinalMethod() {...}
    }
    

    C#

    public class MyClass : MyBaseClass
    {
        public sealed override void MyFinalMethod() {...}
    }
    

    As Joachim Sauer points out, a notable difference between the two languages here is that Java by default marks all non-static methods as virtual, whereas C# marks them as sealed. Hence, you only need to use the sealed keyword in C# if you want to stop further overriding of a method that has been explicitly marked virtual in the base class.

    Variables

    To only allow a variable to be assigned once:

    Java

    public final double pi = 3.14; // essentially a constant
    

    C#

    public readonly double pi = 3.14; // essentially a constant
    

    As a side note, the effect of the readonly keyword differs from that of the const keyword in that the readonly expression is evaluated at runtime rather than compile-time, hence allowing arbitrary expressions.