601

finalC#の Java に相当するものは何ですか?

4

7 に答える 7

907

このfinalキーワードには、Java でいくつかの用法があります。使用されるコンテキストに応じて、C# のキーワードsealedとキーワードの両方に対応します。readonly

クラス

サブクラス化 (定義されたクラスからの継承) を防ぐには:

ジャワ

public final class MyFinalClass {...}

C#

public sealed class MyFinalClass {...}

メソッド

メソッドのオーバーライドを防ぎますvirtual

ジャワ

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

C#

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

Joachim Sauer が指摘しているように、ここでの 2 つの言語の顕著な違いは、Java はデフォルトですべての非静的メソッドを としてvirtualマークするのに対し、C# はそれらを としてマークすることsealedです。したがって、基本クラスでsealed明示的にマークされたメソッドのそれ以上のオーバーライドを停止する場合にのみ、C# でキーワードを使用する必要があります。virtual

変数

変数の割り当てを 1 回だけ許可するには、次のようにします。

ジャワ

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

C#

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

補足として、キーワードの効果は、式がコンパイル時ではなく実行時に評価されるreadonlyという点でキーワードの効果とは異なるため、任意の式が許可されます。constreadonly

于 2009-08-25T11:06:32.087 に答える
202

それは文脈に依存します。

于 2009-08-25T11:06:45.267 に答える
50

ここに誰もが欠けているのは、Java が final メンバー変数の明確な代入を保証していることです。

最終メンバー変数 V を持つクラス C の場合、C のすべてのコンストラクターを通るすべての可能な実行パスは、V を 1 回だけ割り当てる必要があります。V の割り当てに失敗したり、V を 2 回以上割り当てたりすると、エラーが発生します。

C# の readonly キーワードには、そのような保証はありません。コンパイラは、readonly メンバーを割り当てられていないままにしておくか、コンストラクター内でそれらを複数回割り当てることを許可します。

そのため、final と readonly (少なくともメンバー変数に関して) はまったく同等ではありません。final ははるかに厳密です。

于 2010-05-07T18:45:41.550 に答える
7

前述のように、for メソッドとクラスにsealed相当します。final

残りは複雑です。

  • static finalフィールドの場合、可能static readonlyな限り最も近いものです。これにより、静的コンストラクターで静的フィールドを初期化できます。これは、Java の静的初期化子とかなり似ています。これは、定数 (プリミティブと不変オブジェクト) と可変オブジェクトへの定数参照の両方に適用されます。

    修飾子は定数のconst場合とかなり似ていますが、静的コンストラクターで設定することはできません。

  • コンストラクターを離れたら再割り当てしてはならないフィールドでreadonly使用できます。ただし、等しくはありませんfinal。コンストラクターまたはイニシャライザーでも、割り当ては 1 つだけ必要です。

  • final私が知っているローカル変数に相当する C# はありません。なぜ誰かがそれを必要とするのか疑問に思っている場合: if-else、switch-caseなどの前に変数を宣言できます。final を宣言することで、最大 1 回割り当てられるように強制します。

    一般に、Java ローカル変数は、読み取る前に少なくとも 1 回割り当てる必要があります。値が読み取られる前に分岐が飛び出さない限り、最終的な変数は 1 回だけ割り当てられます。これらはすべてコンパイル時にチェックされます。これには、エラーの余地が少なく、適切に動作するコードが必要です。

要約すると、C# には に直接相当するものはありませんfinal。Java には C# の優れた機能がいくつか欠けていますが、Java プログラマーである私にとっては、C# が同等の機能を提供できない場所を確認できて新鮮です。

于 2015-02-19T09:05:51.453 に答える
6

Java クラスの final とメソッドの final -> 封印。Java メンバ変数 final -> 実行時定数は readonly、コンパイル時定数は const。

ローカル変数 final とメソッド引数 final に相当するものはありません

于 2009-08-25T11:20:33.633 に答える
5

http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

C# 定数は、コンパイル時定数の const キーワードまたは実行時定数の readonly キーワードを使用して宣言されます。定数のセマンティクスは、C# 言語と Java 言語の両方で同じです。

于 2009-08-25T11:08:28.133 に答える
1

密封された

于 2009-08-25T11:07:05.343 に答える