web-dev-qa-db-ja.com

C#シールvs Java最終

次のsealedの使用がコンパイルされない理由として、誰か教えてください。一方、sealedfinalに置き換えて、Javaとしてコンパイルすると、機能します。

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

これは、Javaのfinalは、使用する場所に応じてさまざまな意味を持ちますが、C#のsealedのみ適用されるためです。 クラスおよび潜在的に仮想メンバー(メソッド、プロパティ、イベント)。

In Java finalは以下に適用できます:

  • classes、これはクラスを継承できないことを意味します。これは、C#のsealedと同等です。
  • methods、これは、派生クラスでメソッドをオーバーライドできないことを意味します。これは、メソッドをvirtualとして宣言しない限り、C#のデフォルトであり、派生クラスでは、sealedを使用してさらに派生クラスでこれを防ぐことができます。
  • fieldsおよびvariables、つまり、初期化できるのは1回だけです。フィールドの場合、C#で同等のものはreadonlyです。
57
Joey

Sealed in C#参照型にのみ適用でき、継承ツリーに影響を与えます。

実際には、sealedとしてマークされた型は、継承ツリーの最後の「葉」であることが保証されています。つまり、sealedのように宣言された型から派生することはできません。

public sealed class Child : Base 
{
}

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

会員には適用できません。

6
Tigran

ジョーイの答えは少し間違っていますが、ティグランの答えは間違っていません。
最初に、このページを調べることができます: C#でのJavaのファイナルに相当するものは何ですか?
sealedキーワードはclassinstance methodおよびpropertyに適用できますが、変数やインターフェースのメソッドには適用できません。 sealedのクラスは継承できません。 sealedがメソッドを使用する場合、それは会社のoverrideによるものでなければなりません。すべてのstructsealedであるため、structを継承することはできません。この画像を確認してください: sealed usage

2
Shedom Wei