209

一つだけはっきりさせておきたい。これはどちらが優れているかという問題ではなく、その部分については他の人に議論を任せます。私はそれを気にしません。就職の面接でこの質問をされたので、もう少し学ぶと役に立つかもしれないと思いました.

これらは私が思いつくことができるものです:

  • Java は「プラットフォーム非依存」です。最近ではMonoプロジェクトがあると言えますので、C# も考えられますが、それは少し誇張されていると思います。なんで?Java の新しいリリースが完了すると、それがサポートするすべてのプラットフォームで同時に利用できるようになりますが、Mono の実装にはまだ C# 3.0 の機能がいくつ欠けているのでしょうか? それとも、ここで比較するのは本当にCLRJREのどちらなのでしょうか?
  • Java はイベントとデリゲートをサポートしていません。私の知る限りでは。
  • Java では、すべてのメソッドが仮想です
  • 開発ツール: Visual Studio のようなツールはまだないと思います。特に、チーム エディションを使用したことがある場合は、私の言いたいことがわかるでしょう。

関連すると思われる他のものを追加してください。

更新: ふと思いついたのですが、Java にはクラスやメソッドなどのカスタム属性のようなものはありません。

4

7 に答える 7

329

Java 7 と C# 3 の比較

(Java 7 の一部の機能についてはここでは触れていませんが、usingC# のすべてのバージョンが Java 1 ~ 6 より優れているというステートメントの利点は削除されています。)

あなたの要約のすべてが正しいわけではありません:

  • Java のメソッドはデフォルトで仮想ですが、それらを final にすることができます。(C# では、既定でシールされていますが、仮想にすることができます。)
  • 無料 (Eclipse、Netbeans など) と商用 (IntelliJ IDEA など) の両方で、Java 用の IDE はたくさんあります。

それを超えて(そしてすでに要約にあるもの):

  • ジェネリックは 2 つの間で完全に異なります。Javaジェネリックは、コンパイル時の「トリック」にすぎません(しかし、その点では便利です)。C# と .NET では、ジェネリックは実行時にも維持され、参照型だけでなく値型でも機能し、適切な効率を維持します (たとえば、ボックス化されたバイトの配列ではなく、それを裏付けるものとして) List<byte>byte[]
  • C# にはチェック例外がありません
  • Java では、ユーザー定義の値の型を作成できません
  • Java には演算子と変換のオーバーロードがありません
  • Java には、反復子の単純な実装のための反復子ブロックがありません
  • JavaにはLINQのようなものはありません
  • デリゲートがないこともあり、Java には匿名メソッドやラムダ式のようなものはありません。通常、匿名の内部クラスがこれらの役割を果たしますが、扱いにくいです。
  • Java には式ツリーがありません
  • C# には匿名の内部クラスがありません
  • 実際、C# には Java の内部クラスがまったくありません。C# のすべてのネストされたクラスは、Java の静的なネストされたクラスのようなものです。
  • Javaには静的クラスがありません(インスタンスコンストラクターがなく、変数、パラメーターなどに使用できません)
  • Java には C# 3.0 の匿名型に相当するものはありません
  • Java には暗黙的に型指定されたローカル変数がありません
  • Javaには拡張メソッドがありません
  • Java にはオブジェクトとコレクションの初期化式がありません
  • アクセス修飾子は多少異なります。Java には (現在) アセンブリに直接相当するものがないため、「内部」の可視性については考えられません。C# には、名前空間 (および継承) を考慮した Java の「既定の」可視性に相当するものはありません。
  • Java と C# の初期化の順序は微妙に異なります (C# は、基本型のコンストラクターへの連鎖呼び出しの前に変数初期化子を実行します)。
  • Java には、言語の一部としてプロパティがありません。それらは get/set/is メソッドの規則です
  • Java には「安全でない」コードに相当するものはありません
  • 相互運用性は、Java の JNI よりも C# (および .NET 全般) の方が簡単です。
  • Java と C# では、列挙型の概念が多少異なります。Java はよりオブジェクト指向です。
  • Java にはプリプロセッサ ディレクティブ (C# の #define、#if など) がありません。
  • Java には、C# に相当するものがなく、参照によってパラメーターを渡すためのものもありrefませout
  • Javaには部分型に相当するものはありません
  • C# インターフェイスはフィールドを宣言できません
  • Javaには符号なし整数型はありません
  • Java には、decimal 型に対する言語サポートがありません。(java.math.BigDecimal はSystem.Decimal のようなものを提供しますが、違いはありますが、言語サポートはありません)
  • Java には null 許容値型に相当するものはありません
  • Java でのボクシングは、特定の操作を伴う定義済みの (ただし「通常の」) 参照型を使用します。C# と .NET でのボックス化は、より透過的な問題であり、任意の値型の CLR によるボックス化のために参照型が作成されます。

これはすべてを網羅しているわけではありませんが、私が考えつくすべてをカバーしています。

于 2008-11-17T10:16:58.687 に答える
24

以下は、C#とJavaの違いに関するDareObasanjoによる詳細なリファレンスです。この2つを切り替えるときは、常にこの記事を参照しています。

http://www.25hoursaday.com/CsharpVsJava.html

于 2008-11-17T10:55:11.153 に答える
11

C# には非常に便利な自動プロパティがあり、少なくともゲッ​​ターとセッターにカスタム ロジックがない場合は、コードをクリーンに保つのにも役立ちます。

于 2008-11-17T13:56:23.520 に答える
10

Java には存在しない C# の機能 • C# には、より多くのプリミティブ型と、算術例外をキャッチする機能が含まれています。

• 演算子のオーバーロードやユーザー定義のキャストなど、Java よりも多くの便利な表記法が含まれており、C++ プログラマーの大規模なコミュニティには既になじみ深いものです。

• イベント処理は「第一級市民」であり、言語自体の一部です。

• クラスに似ていますが、スタックに割り当てることができる「構造体」の定義を許可します (C# や Java のクラスのインスタンスとは異なります)。

• C# は、言語構文の一部としてプロパティを実装します。

• C# では、switch ステートメントで文字列を操作できます。

• C# では、クロージャ機能を提供する匿名メソッドを使用できます。

• C# では、関数型の yield キーワードを介してコルーチンを使用するイテレータを使用できます。

• C# は出力パラメーターをサポートしており、C++ と SQL で共有される機能である複数の値を返すのに役立ちます。

• C# には名前空間の別名を付ける機能があります。

• C# には、クラスが独自のクラス メソッドとは別に、インターフェイスのメソッドを明確に実装できるようにする「明示的なメンバー実装」があります。これにより、たまたま同じ名前のメソッドを持つ 2 つの異なるインターフェイスを実装することもできます。インターフェイスのメソッドは public である必要はありません。そのインターフェイスを介してのみアクセスできるようにすることができます。

• C# は、COM との統合を提供します。

• C および C++ の例に従って、C# はプリミティブ型と参照型の参照による呼び出しを許可します。

Java Absent in C# の機能

• Java の strictfp キーワードは、浮動小数点演算の結果がプラットフォーム間で同じであることを保証します。

• Java は、エラーのトラップと処理を強化するためにチェック例外をサポートしています。

于 2012-01-04T16:01:13.337 に答える
9

もう 1 つの優れたリソースはhttp://www.javacamp.org/javavscsharp/です。 このサイトには、これら 2 つのプログラミング言語のほとんどすべての違いを説明する多くの例が列挙されています。

属性については、Java にはアノテーションがあり、ほぼ同じように機能します。

于 2008-11-20T13:40:52.300 に答える
5

ジェネリック:

Java ジェネリックを使用すると、実際には .NET で得られる実行効率は得られません。これは、Java でジェネリック クラスをコンパイルするときに、コンパイラが型パラメーターを取り除き、あらゆる場所で Object を置き換えるためです。たとえば、Foo<T>クラスがある場合、Java コンパイラは Byte Code を生成しFoo<Object>ます。これは、キャストとボックス化/ボックス化解除を「バックグラウンド」で行う必要があることを意味します。

私はしばらくJava/C#で遊んでいますが、私の意見では、言語レベルでの主な違いは、あなたが指摘したようにデリゲートです。

于 2008-11-17T10:14:43.403 に答える
0

以下のリンクを参照してください msdn.microsoft.com/en-us/library/ms836794.aspx C# と Java の類似点と相違点の両方をカバーしています

于 2014-05-02T08:40:35.070 に答える