一つだけ明確にしたい。これはどちらが良いかという質問ではなく、議論するために他の誰かに任せている部分です。私は気にしません。私は就職の面接でこの質問をされましたが、もう少し学ぶことが役立つと思いました。
これらは私が思いつくものです:
関連すると思われる他の人を追加してください。
更新:頭に浮かんだのですが、Javaにはクラス、メソッドなどのカスタム属性のようなものがありません。
Java 7とC#3の比較
(Java 7の一部の機能についてはここでは言及しませんが、Java 1-6よりもすべてのバージョンのC#のusing
ステートメントの利点は削除されました。)
すべての要約が正しいわけではありません:
それを超えて(そしてあなたの要約にはすでに何があるのか):
List<byte>
を、ボックス化されたバイトの配列ではなく、byte[]
としてサポートします)。ref
およびout
に相当するものはありませんこれは網羅的なものではありませんが、手に負えないと考えることができるすべてを網羅しています。
以下は、C#とJavaの違いに関する、Dare Obasanjoによる詳細なリファレンスです。この2つを切り替えるときには、常にこの記事を参照していることに気付きます。
C#には、非常に便利な自動プロパティがあり、少なくともゲッターとセッターにカスタムロジックがない場合は、コードをよりクリーンに保つのにも役立ちます。
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はチェックされた例外をサポートし、エラーのトラップと処理をより適切に実施します。
もう1つの優れたリソースは http://www.javacamp.org/javavscsharp/ このサイトでは、これら2つのプログラミング言語のほとんどすべての違いを示す多くの例を列挙しています。
属性について、Javaには注釈があり、ほぼ同じように機能します。
ジェネリック:
Javaジェネリックを使用すると、Javaでジェネリッククラスをコンパイルすると、コンパイラがtypeパラメータを取り除いてObjectをすべての場所で置換するため、.NETで得られる実行効率は実際には得られません。たとえば、Foo<T>
クラスがある場合、Javaコンパイラは、Foo<Object>
であるかのようにバイトコードを生成します。これは、「バックグラウンド」でキャストとボクシング/アンボクシングを行う必要があることを意味します。
私はしばらくの間Java/C#で遊んでいますが、私の意見では、言語レベルでの大きな違いは、ご指摘のとおり、デリゲートです。
以下のリンクをご覧くださいmsdn.Microsoft.com/en-us/library/ms836794.aspx C#とJavaの類似点と相違点の両方をカバーしています。