Javaを学びたいと考えているC#開発者にとって、指摘すべき2つの言語の間に大きな根本的な違いはありますか?
物事は同じだと思っている人もいるかもしれませんが、見逃してはならない重要な側面がいくつかありますか?(またはあなたは本当に台無しにすることができます!)
たぶん、OOP構造、GCの動作方法、参照、デプロイメント関連などの観点から。
Javaを学びたいと考えているC#開発者にとって、指摘すべき2つの言語の間に大きな根本的な違いはありますか?
物事は同じだと思っている人もいるかもしれませんが、見逃してはならない重要な側面がいくつかありますか?(またはあなたは本当に台無しにすることができます!)
たぶん、OOP構造、GCの動作方法、参照、デプロイメント関連などの観点から。
回答:
私の頭のてっぺんからいくつかの落とし穴:
byte Javaで署名されています(残念ながら)staticそれを含むクラスのインスタンスへの暗黙の参照があります。これは2つの言語の非常に包括的な比較です:
http://www.25hoursaday.com/CsharpVsJava.html
追加:http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
プロパティについて誰も言及していないことに驚いています。これは、C#では非常に基本的なことですが、Javaにはありません。C#3以降では、プロパティも自動的に実装されています。Javaでは、GetX / SetXタイプのメソッドを使用する必要があります。
もう1つの明らかな違いは、JavaにはないC#3のLINQ式とラムダ式です。
逐語的な文字列(@ "")、演算子のオーバーロード、yieldを使用するイテレータ、プリプロセッサなど、Javaには他にもいくつかの単純ですが便利なものがありません。
C#での私の個人的なお気に入りの1つは、名前空間名が物理ディレクトリ構造に従う必要がないことです。私はこの柔軟性が本当に好きです。
多くの違いがありますが、これらは私にとって頭に浮かびます:
.equalsあなたが使わなければならないものです。
.NETはジェネリックを具体化しました。Javaはジェネリックを消去しました。
違いは次のとおりです。ArrayList<String>オブジェクトがある場合、.NETでは、オブジェクトの型が(実行時)であることがArrayList<String>わかりますが、Javaでは、実行時のオブジェクトの型はArrayList;です。String一部が失われます。非Stringオブジェクトをに入れた場合ArrayList、システムはそれを強制できず、アイテムを抽出しようとした後にのみそれを知ることができ、キャストは失敗します。
Stringチェックされていないキャストをどこかに行わずにそのリストに非オブジェクトを入れることはできないことを追加する価値はありますが、コンパイラはその時点でコンパイラがジェネリック境界をチェックできなくなったことを正しく警告します。リストが常にの変数に格納されている限り、List<String>文字列以外のオブジェクトをリストに挿入しようとしてもコンパイルされません。
addメソッドを呼び出したとします(ここでもリフレクションを介して)。システムは非Stringオブジェクトをすぐに拒否しますか、それとも結果をキャストするときにのみ拒否しますgetか?
List。List、like ArrayList、およびの子孫であるタイプのオブジェクトを持つことができますLinkedList。(それらを渡すときのList代わりに使用することが重要ですArrayListが、それはあなたが言うことができないという事実を変えませんnew List()。)
JavaのC#で見逃していることの1つは、チェックされた例外の強制処理です。C#では、メソッドがスローする可能性のある例外に気づかず、それらを発見するためのドキュメントやテストに翻弄されることはよくあることです。チェックされた例外を除いて、Javaではそうではありません。
Javaに組み込まれている日付/カレンダー機能は、System.DateTimeと比較してひどいものです。ここにはこれに関する多くの情報があります:Java Date&Time APIの何が問題になっていますか?
これらのいくつかは、C#開発者にとっての落とし穴になる可能性があります。
さらに、Javaには、GACや厳密な名前のアセンブリがもたらす機能と同じ機能がすべて備わっているわけではありません。 ジャーヘルは、外部ライブラリをリンク/参照するときに問題が発生する可能性があることを表す用語です。
パッケージング/展開に関する限り:
私のインタビューリストに載っているb / cから飛び出すことの一つは、メソッドを隠すための「新しい」キーワードアナログがJavaになく、「ここに新しいものを置くべきだ」というコンパイラ警告がないことです。オーバーライドしようとしたときに誤ってメソッドが非表示になると、バグが発生します。
(たとえば編集)例、BはAから派生します(C#構文を使用すると、Javaは前回チェックしたのと同じように動作しますが、コンパイラの警告は表示されません)。Aのfooが呼び出されますか、それともBのfooが呼び出されますか?(Aが呼び出され、おそらくBを実装した開発者を驚かせます)。
class A
{
public void foo() {code}
}
class B:A
{
public void foo() {code}
}
void SomeMethod()
{
A a = new B(); // variable's type is declared as A, but assigned to an object of B.
a.foo();
}
new意図的に非表示にするオーバーライドやメソッドはありません。または非最終的なものであるため、非表示ではなくオーバーライドされます。
C#からのJavaを使用するときにこれまでに遭遇した問題の1つは、例外とエラーが異なることです。
たとえば、catch(Exception e)を使用してメモリ不足エラーをキャッチすることはできません。
詳細については、以下を参照してください。
why-is-java-lang-outofmemoryerror-java-heap-space-not-caught
Javaを使用してからかなりの時間が経ちましたが、アプリケーション開発ですぐに気付いたのは、C#イベントモデル、C#ドラッグアンドドロップとSwingでのレイアウトマネージャーの使用(App devを実行している場合)、およびJavaは、例外をキャッチし、C#は不要であることを確認します。
タイトルの非常に直接的な質問への回答:
「Javaを学ぶC#開発者、見落としがちな最大の違いは何ですか?」
A:JavaはWindowsではかなり遅いという事実。