C#にJavaよりも多くの機能があるのはなぜですか?[閉まっている]


14

これはJavaとC#の引数であることを意図していないことに注意してください。私は、C#の経験のないJavaプログラマーであり、好奇心だけを求めています。

私はC#でいくつかの読書をしましたが、Javaよりもはるかに多くの機能を持っているようです。いくつかの例:

  • 型推論。
  • dynamic キーワード。
  • デリゲート。
  • オプションのパラメーター。
  • ラムダとLINQ (実際、これらが何であるかわかりません)。
  • プロパティ。

ただし、JavaにはC#にはない機能は何もありません。

私の質問は、なぜC#にはJavaよりもはるかに多くのネイティブ機能があるのですか?そして、なぜJavaは、プロパティや型推論など、これらの一部を長年にわたって追加しなかったのですか?Java言語の設計者は、より単純なアプローチを取っていますか?この理由は何ですか?


2
@Patrick-それは機能ですか-実装の詳細ですか?
ピート14

14
偏った答え:C#の設計チームは自分が何をしているかを知っているからです。より合理的な答え:C#はJavaの失敗に関する知識と、独断的な「純粋なOOのみ」(まったくヒットしなかった)なしで設計されました。これらの機能の半分はLispとHaskellから一括インポートされ、2つの言語JavaはJava 8まで触発されることを断固として拒否しました。他の機能は、Javaの欠如によって盲目的に明らかにされた健全性の改善です。
Phoshi

4
C#は後で登場し、当初はJavaの露骨な手抜きでしたが、その後、価値のあるものすべてを追加する機会がありましたが、Javaは非常に厳しい後方互換性の目標によって妨げられていました。
キリアンフォス14

2
@ Clockwork-Museですが、C#にはCLRとMonoの2つのランタイム実装があります。Xamarinもあります。Javaを使用してiOS / Android / WinPhoneのクロスプロジェクトを構築するための単一のソリューションについて聞いたことがありません。
デン

4
@KilianFoth:実際には、C#は最初はDelphiを巧みに操って、Javaのように書き換えられました。マイクロソフトは、Delphiプロジェクトアーキテクトをボーランドから遠ざけて作成しました。
メイソンウィーラー14

回答:


22

いくつかの理由:

  1. C#はJavaよりも遅れて登場しました。バージョン1はJava 1.4の露骨な搾取であったため、Javaがその時点で持っていたものはほとんどすべて揃っていました。
  2. しかし、C#はJavaよりもはるかに速く開発されました。これは、エキサイティングな新しいプラットフォームであったためです(Turbo Pascalの父であるAnders Hejlsbergにすばらしいドライバーがありました)。これにより、明らかになったJavaのすべての間違いを回避しながら、Java実践者が望んでいたすべてを追加できました。
  3. 一方、Javaは非常に厳密な後方互換性の目標と開発のペースの遅さによって妨げられました。これは、95%の非天才の標準、企業、信頼性、非驚きのソリューションであるという評判を必死に獲得しようとしたためですプログラマ。これで、彼らは成功しました。

その結果、Javaには少し機能のギャップがあります。将来の大きな計画がありますが、この種のものではいつものようにすべてが計画よりも少し時間がかかります。


7
私はこれに同意するかどうかわかりません。私はそれがすべて真実であることを意味しますが、その理由は太陽の崩壊をめぐる政治ともっと関係があると思います。Javaには基本的に5年以上の期間があり、組織やリーダーシップがなかったため、新しい機能はありませんでした。
テラスティン14

7
C#1には値型がありました。Javaには決してないもの。したがって、単なる「露骨なぼったくり」ではありません。
デン

1
@Telastyn-それがここでの最も重要な理由だと思います。特に、「そして、あなたはオラクルに買収される」を太陽崩壊の終わりに追加するとき。
ワイアットバーネット14

7
@Denに同意します。C#がより速く(そして正しい方向に)開発される最大の理由は、Anders Hejlsbergのリーダーシップだと思います。彼と彼のチームは、他の言語から最高の機能を追加し、それらをC#にシームレスに統合することに成功しました。その結果、C#には混乱や煩雑さを感じることなく、非常にきちんとした言語機能が備わっています。
デビッドカークランド

1
@WesleyWiser-「将来の可能性がある」にアップグレードされました。
デン14

4

JavaとC#の大きな違いの1つは、C#デザイナーが言語だけでなく標準IDEも制御するということです。

拡張メソッドや部分クラスなどを追加すると、IDEで適切にサポートされない場合、開発/制御のバージョン管理で悪夢になります。

選択したプラットフォーム(Eclipse、Netbeans、vi + Ant)でJavaをコンパイルできることが期待されているため、コードを壊す(およびこれらを使用してLINQなどの追加拡張機能を開発する)機能を追加するのは、単に「 IntelliSenseはこれらのケースを処理するため、心配する必要はありません」。

また、機能の数ではなく、機能の価値に注目する価値がある場合もあります。たとえば、自動プロパティは優れており、Javaがこれをサポートすることを望んでいますが、最終的には、Javaでさらに数行のコードを記述する必要があることを意味します。同様に、「イベント」機能を呼び出すことは、特別にラベル付けされたデリゲートに過ぎず、Javaですでに使用されているObserverパターンの洗練されたコピーであるため、多少誤った名前であることがわかりますコーディング)

誤解しないでください。C#はいくつかの注目すべきイノベーションを導入していると思います。いつかOracleの大ボスが目覚めて、真の「Java 2」を起動してこれらのいくつかを含めることを望みますが、ギャップはあなたほど明確ではありません疑問点。


2
単純なプロパティ定義(宣言+取得/設定+空白)に必要な9行は、すぐに「少数」以上になります。
ケビンクライン14

@kevinclineと私もセッターとゲッターの両方を適切に文書化します。しかし、最終的には、アクセサーにIDE自動コード生成を使用していない場合でも、ビジネスロジック、テスト、コード設計に費やした時間を考慮に入れると、これらに顕著な時間を使用しません(実際にはアクセサーを入力するときでも、これらについてほとんど考えています)。だから、素敵な一方で、それは...最後には大きな違いになりますものではありません
SJuan76

3
それらを書く時ではありません。興味深い部分に向かう途中で、何度も何度もそれらを読み、無視する時です。
ケビンクライン14

@kevincline私は同意します。読みやすさとコードがきれいです。これだけで、内蔵されているObserverパターンのイベント、などの理由I値のものですが、これらを自分で書かなければならなかった場合は、物事は非常にクリーンのthabを作る
テルアビブコーン

@AvivCohn問題は、「組み込み」が重要な部分だということです。あなたがアセンブリに動的ディスパッチを持つことができ、あなたが持つことができるすべての単一言語機能は、Cで高次機能を持つことができている、明らかに、いくつかの点で、それはまだあなたのx86 CPU上で実行されるため-アセンブリ内で可能。デリゲートがあるため、C#でコマンドパターンを実装する必要はほとんどありません。オブザーバーやイベント、その他多くの場合も同じです。Javaにはしばらくの間匿名メソッドがありましたが、匿名全体を作成する必要がありました。これらはすべて小さなものですが、合計されます。
ルアーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.