web-dev-qa-db-ja.com

C#とJavaの大きな違いは何ですか?

一つだけ明確にしたい。これはどちらが良いかという質問ではなく、議論するために他の誰かに任せている部分です。私は気にしません。私は就職の面接でこの質問をされましたが、もう少し学ぶことが役立つと思いました。

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

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

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

更新:頭に浮かんだのですが、Javaにはクラス、メソッドなどのカスタム属性のようなものがありません。

209
Enes

Java 7とC#3の比較

(Java 7の一部の機能についてはここでは言及しませんが、Java 1-6よりもすべてのバージョンのC#のusingステートメントの利点は削除されました。)

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

  • Javaでは、メソッドはデフォルトで仮想ですが、最終的なものにすることができます。 (C#ではデフォルトで封印されていますが、仮想にすることができます。)
  • Java用のIDEには、無料(Eclipse、Netbeansなど)と商用(IntelliJ IDEAなど)の両方があります

それを超えて(そしてあなたの要約にはすでに何があるのか​​):

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

これは網羅的なものではありませんが、手に負えないと考えることができるすべてを網羅しています。

329
Jon Skeet

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

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

24
Winston Smith

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

11

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

•演算子のオーバーロードやユーザー定義のキャストなど、その多くがすでにC++プログラマーの大規模なコミュニティになじみのある、Javaに対する表記上の便利さを多数備えています。

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

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

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

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

•C#は、クロージャー機能を提供する匿名メソッドを許可します。

•C#では、機能スタイルのyieldキーワードを介してコルーチンを使用するイテレーターが許可されます。

•C#は、C++とSQLで共有される機能である、複数の値の戻りを支援する出力パラメーターをサポートしています。

•C#には、名前空間をエイリアスする機能があります。

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

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

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

C#にないJavaの機能

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

•Javaはチェックされた例外をサポートし、エラーのトラップと処理をより適切に実施します。

10
Abhishek kumar

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

属性について、Javaには注釈があり、ほぼ同じように機能します。

9
Rafael Romão

ジェネリック:

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

私はしばらくの間Java/C#で遊んでいますが、私の意見では、言語レベルでの大きな違いは、ご指摘のとおり、デリゲートです。

5
bruno conde

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

0
Kanwar Singh