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


209

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

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

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

関連性があると思われるものを追加してください。

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


1
言語は、ライブラリとも異なる言語実装とは異なります。何を比較しようとしていますか?
ミゲルPingの

1
CシャープとJavaの比較を参照してください。
ギメル2008年

2
私はこの1つが見つかっmsdn.microsoft.com/en-us/library/ms836794.aspxこれは、C#とJavaの間の類似性と差異の両方をカバーしています。
ビプル

1
適切なライブラリを使用すると、Javaについて以下に説明する多くのことが得られます。たとえば、次の有効なJavaコードを確認してください。new String [] {"james"、 "john"、 "john"、 "eddie"} .where(startsWith( "j"))。distinct(); lombok-pgと呼ばれるライブラリを使用します。github.com/nicholas22/jpropel
NT_

回答:


329

Java 7とC#3の比較

(ここではJava 7の一部の機能については触れていませんが、usingJava 1〜6に対するC#のすべてのバージョンの利点は削除されています。)

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

  • 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は静的なクラスがない(持っていない任意のインスタンスコンストラクタを、そして変数に使用することができない、などのパラメータ)
  • JavaにはC#3.0の匿名型に相当するものはありません
  • Javaには暗黙的に型付けされたローカル変数はありません
  • Javaには拡張メソッドがありません
  • Javaにはオブジェクトとコレクションの初期化式がありません
  • アクセス修飾子は多少異なります-Javaでは(現在のところ)直接のアセンブリに相当するものはないため、「内部」の可視性についての考えはありません。C#では、名前空間(および継承)を考慮したJavaの「デフォルト」の可視性に相当するものはありません
  • JavaとC#での初期化の順序は微妙に異なります(C#は、基本型のコンストラクターへのチェーン呼び出しの前に変数初期化子を実行します)
  • Javaには、言語の一部としてプロパティはありません。それらはget / set / isメソッドの規約です
  • Javaには「安全でない」コードに相当するものがありません
  • InteropはC#(および.NET全般)でJavaのJNIよりも簡単です
  • JavaとC#では、列挙の考え方が多少異なります。Javaははるかにオブジェクト指向です。
  • Javaにはプリプロセッサディレクティブがありません(C#では#define、#ifなど)。
  • JavaはC# 'sと同等を持っていないrefout、参照によってパラメータを渡すため
  • Javaには部分型に相当するものはありません
  • C#インターフェイスはフィールドを宣言できません
  • Javaには符号なし整数型はありません
  • Javaは、10進数型の言語をサポートしていません。(java.math.BigDecimalはSystem.Decimalのようなものを提供します-違いがありますが、言語サポートはありません)
  • Javaには、null許容値型に相当するものはありません
  • Javaのボクシングでは、事前定義された(ただし「通常の」)参照型を使用し、特定の操作を行います。C#および.NETでのボクシングは、より透過的なものであり、CLRによってボクシング用に参照タイプが作成され、任意の値タイプが使用されます。

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


24
@ブライアン:Javaのジェネリックスと内部クラスの詳細は、Javaがシンプルさによって優位性を実現するという考えをすぐに打ち砕くと思います;)
Jon Skeet

8
@OrangeDog:IMO、主に自分自身をからかっていると主張する人々。明示的なtry / finallyブロックを作成するように強制されている方が、usingステートメントのIMOよりもエラーが発生しにくいことを確認するのは困難です。Javaと比較したC#の「余分な」機能のほとんどは、少ないコードで済むこと、およびそのコードが読みやすくなることを意味します。
Jon Skeet、2011年

17
@OrangeDog:興味を持って、あなたはどれくらい公平なのですか?はい、私はC#の愛好家ですが、Javaの経験もかなり豊富です。結局のところ、それが私の仕事です。Javaを効果的に使用する方法を知らないようではありません。
Jon Skeet、2011年

8
@OrangeDog:まず第一に、ほとんどの開発者は私が知る限り「安全でない」を使用してコードを記述しないので、それは赤いニシンです。私はまた、証明可能性は赤いニシンだと思います-正式な証明可能性は、人間がコードについて推論することがいかに簡単であるかとはあまり関係がないと思います。私の要点は、JavaとC#の両方でかなりの経験がある人として、C#は生産性と読みやすさの点ではるかに優れた言語であると私は思うということです。反対を感じたら、両方の言語での経験レベルを明確にできますか?それは議論にかなり関連していると思います。
Jon Skeet

21
@OrangeDog:さらに、「より多くのことができるようになると、間違って実行する可能性が高まる」というあなたの主張も、誤ったIMOです...それは、簡単にする言語で、あなたはそれをする必要は全くありません。それは単に真実ではありません-多くの場合、JavaとC#で実行する必要のあるタスクは同じですが、機能が不足しているため、Javaではこれらのタスクを正しく実行することが難しくなっています。タスクを簡略化することにより、この機能、間違って実行する可能性を減らします。
Jon Skeet

24

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

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


2
@Jon Skeet:あなたは最もC#のアクティブな開発者です。C#とJavaのバージョンの違いを維持しませんか。私は人々がそれを読みたいと思うに違いない。

1
@claws:やりたいことをすべて行う時間がありません。
Jon Skeet

19
@Winston:「チャックノリスとジョンスキートの違い」リストが必要です。1)チャックノリスには常に時間があります。JonはTimeDate常に時間を持つためにクラスを変更する必要があり、まだ時間がないためです:(
RedFilter

11

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


10

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

•Javaを介した表記上の便利な機能が多数含まれています。演算子のオーバーロードやユーザー定義のキャストなど、C ++プログラマーの大規模なコミュニティには、その多くがすでに馴染みがあります。

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

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

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

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

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

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

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

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

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

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

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

C#に存在しないJavaの機能

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

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


9

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

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


5

ジェネリック:

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

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


これは間違っています。ジェネリックスの消去または具体化(それぞれJavaおよびC#)が必ずしもパフォーマンスに影響を与えるとは限りません。
ミゲルピン

オートボクシングとキャストを混同しています。
JesperE 2008年

3
いいえ、ブルーノはパフォーマンスの違いについて正しいです。Javaで(一般的に)List <byte>に相当するものを取得する方法はありません。ボクシングのペナルティ(時間とメモリ)が発生するList <Byte>が必要です。
ジョン・スキート

(アン)ボクシングは、プリミティブ型であるボックス型に対してのみ発生します。
Miguel Ping、

1
次の記事を参照してください:jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.