С# закрыто против Java final

Кто-нибудь, пожалуйста, скажет мне, что причина, по которой следующее использование sealed не компилируется? Если я заменил sealed на final и скомпилировал его как Java, он будет работать.

private sealed int compInt = 100;
public bool check(int someInt)
{
    if (someInt > compInt)
    {
        return true;
    }
    return false;
}

Ответ 1

Это потому, что final в Java означает множество разных вещей в зависимости от того, где вы его используете, тогда как sealed в С# применяется только к классам и потенциально виртуальным членам (методы, свойства, события).

В Java final можно применить к:

  • классы, что означает, что класс не может быть унаследован. Это эквивалентно С# sealed.
  • методы, что означает, что метод не может быть переопределен в производном классе. Это значение по умолчанию в С#, если вы не объявите метод как virtual и в производном классе это может быть предотвращено для последующих производных классов с sealed снова.
  • поля и переменные, что означает, что их можно инициализировать только один раз. Для полей эквивалент в С# равен readonly.

Ответ 2

Sealed в C# может применяться только к ссылочным типам и влияет на дерево наследования.

На практике тип, обозначенный как Sealed, является последним "листом" в дереве наследования, или, короче говоря, вы не можете получить тип, объявленный как a Sealed.

public sealed class Child : Base 
{
}

public class AnotherAgain : Child //THIS IS NOT ALLOWED
{
}

Он не может быть применен к членам.

Ответ 3

Ответ Тиграна не ошибается, в то время как Джои немного неверен.
Во-первых, вы можете посмотреть на эту страницу: Что эквивалентно окончанию Java в С#?. Ключевое слово sealed может применяться к class, instance method и property, но не к переменным или интерфейсным методам. Классы с sealed не могут быть унаследованы. Когда метод sealed put, он должен быть override в компании. Каждый struct равен sealed, поэтому struct нельзя унаследовать. Проверьте это изображение: sealed usage