What is the equivalent of Java's final in C#?
access-modifiers, c#, reserved-words
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.
Problem
What is the equivalent of Java's `final` in C#?