1. ホーム
  2. c#

[解決済み】C#とJavaの大きな違いは何ですか?

2022-04-20 02:15:50

質問

1つだけはっきりさせておきたいことがあります。これはどちらが優れているかという質問ではなく、その部分は他の方の議論にお任せします。私は気にしない。 面接でこの質問をされたので、ちょっと勉強になるかなと思って。

思いつくのはこんな感じです。

  • Javaはプラットフォーム非依存です。まあ今で言えば モノ C#も同じように考えることができますが ちょっと大げさだと思うのですが。なぜか?一方、C# 3.0はMonoの実装にどれだけの機能が欠けているのでしょうか。それとも、本当に CLR vs. 日本原子力研究所 ここで比較すべきは?
  • Javaはイベントとデリゲートをサポートしていません。私の知る限りでは。
  • Javaでは、すべてのメソッドが仮想です
  • 開発ツール。Visual Studioのようなツールはまだないのでは?特にチーム版で仕事をしたことがある人なら、私の言っている意味がわかると思います。

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

更新しました。 ふと思ったのですが、Javaにはクラスやメソッドなどのカスタム属性のようなものはありません。それともあるのでしょうか?

どうすればいい?

Java 7とC# 3を比較する

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

まとめがすべて正しいわけではありません。

  • Javaではメソッドは仮想 デフォルトで しかし、finalにすることができます。(C#ではデフォルトでsealedですが、virtualにすることができます)。
  • Java用のIDEは、無料(例:Eclipse、Netbeans)、商用(例:IntelliJ IDEA)ともにたくさんあります。

その先にあるもの(そして、すでにあなたの要約にあるもの)。

  • 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には(現在のところ)アセンブリに直接相当するものがないので、quot;internal" visibilityの考え方がありません。C#には、名前空間(と継承)を考慮したJavaのquot;default" visibilityに相当するものがありません。
  • JavaとC#では初期化の順番が微妙に違う(C#は変数の初期化子を基本型のコンストラクタの連鎖呼び出しの前に実行する)。
  • Javaには言語としてのプロパティはなく、get/set/isメソッドの慣習となっている
  • Javaにはquot;unsafe;に相当するコードがありません。
  • Java の JNI よりも C# (および .NET 全般) の方が相互運用が容易である
  • JavaとC#では、列挙型に対する考え方がやや異なります。Java の方がよりオブジェクト指向的です。
  • Javaにはプリプロセッサ指示文(C#の#define, #ifなど)がありません。
  • Javaには、C#の refout パラメータを参照渡しする場合
  • Javaには部分型に相当するものがない
  • C#のインターフェースはフィールドを宣言できない
  • Java には符号なし整数の型がない
  • Javaには 言語 は10進数型をサポートしています。(java.math.BigDecimalが提供しているのは のように System.Decimal - 違いはあるが - 言語サポートはない)
  • Java には null 可能な値の型に相当するものがない
  • JavaでのBoxingは、定義済みの(しかしquot;normal")参照型とそれに対する特定の操作を使用します。C#と.NETでのボクシングは、より透明なもので、どのような値型に対してもCLRによってボクシングのための参照型が作成されます。

これは網羅的なものではありませんが、私がすぐに思いつくものはすべてカバーしています。