web-dev-qa-db-ja.com

JavaおよびC ++ではなくC#を選択する理由は何ですか?

C#は最近人気があるようです。構文的にはJavaとほとんど同じだと聞いた。 JavaおよびC++は長い間存在していました。どのような理由でC#よりもC#を選択すべきですかJavaおよびC++?

46
Dark Templar

問題は、「どの言語が現代の一般的なアプリケーション開発に適しているか」です。

編集:以下のコメントの一部に対処しました。小さな発言:イディオムとしてネイティブに多くのものを持っている場合、それを毎回実装またはダウンロードして使用するよりも大きな違いがあると考えてください。ほとんどすべてがこれらの言語のいずれかで実装できます。問題は、言語がネイティブで提供するものです。

だから頭の上から(いくつかの議論は両方の言語に当てはまります)...

C#はC++よりも優れています。

  • nativeガベージコレクションがあります。
  • これにより、クラスメソッドのシグネチャをフリー関数として扱う(つまり、静的に型指定されたthisポインタ引数を無視する)ことができるため、クラス間にさらに動的で柔軟な関係を作成できます。 editこれが何を意味するかわからない場合は、voidを返すメンバーメソッドを割り当て、void (*ptr)()変数にvoidを受け入れてみてください。 C#デリゲートはthisポインターを持ち運びますが、ユーザーは常にそれを気にする必要はありません。クラスのvoid()メソッドを他のvoid()デリゲートに割り当てるだけです。
  • それは非常に多くの便利なものを備えた巨大な標準ライブラリーを持っています。
  • マネージコードブロックとネイティブコードブロックの両方が可能です。
  • アセンブリのバージョン管理は簡単に修正できますDLL地獄の問題。
  • クラス、メソッド、フィールドをAssembly-internalに設定できます(つまり、これらはDLLで宣言されている場所からアクセスできますが、他のアセンブリからはアクセスできません)。

C#はJavaよりも優れています:

  • 多くのノイズ(EJB、プライベート静的クラスの実装など)の代わりに、プロパティやイベントなどのエレガントで使いやすいネイティブコンストラクトが得られます。
  • 実際のジェネリック(Javaがジェネリックを呼び出す)の悪いキャストジョークではない)があり、それらに対してリフレクションを実行できます。
  • ネイティブのリソース管理イディオム(usingステートメント)をサポートしています。 Java 7もこれをサポートする予定ですが、C#はずっと長い間それを持っています。
  • 例外をチェックしていません:)(これが良いか悪いかは議論の余地があります)
  • それがあなたが望むものであるならば、それはWindowsと深く統合されます。
  • LambdasとLINQを備えているため、少量の関数型プログラミングをサポートしています。
  • 一般的な共分散と反分散の両方を明示的に許可します。
  • 必要に応じて、動的変数があります。
  • yieldステートメントを使用した列挙サポートの改善。
  • 新しい値(または非参照)タイプを定義できます。

編集-コメントへの対処

  • C++がネイティブRAIIをサポートしていないとは言いませんでした。 Javaにはありません(明示的にtry/finallyを実行する必要があります)。C++にはRAIIに最適な自動ポインタがあり、(何をしているのかわかっている場合)ガベージコレクションを代用することもできます。
  • 無料の関数のエミュレートについては何も言わなかった。しかし、たとえば、thisポインターによってフィールドにアクセスし、それを行うメソッドを汎用関数ポインター(つまり、同じクラス内ではない)にバインドする必要がある場合、それを行うネイティブの方法はありません。 。 C#では、無料で入手できます。あなたはそれがどのように機能するかを知る必要さえありません。
  • 「メンバーメソッドをフリー関数として扱う」とは、たとえばメンバーメソッドをフリー関数のシグネチャにネイティブにバインドできないことを意味します。これは、メンバーメソッドが「密かに」_thisポインターを必要とするためです。
  • usingステートメントは、明らかにIDisposableラッパーと共に、RAIIの良い例です。 このリンク を参照してください。 GCを持っているので、C++の場合ほどRAIIは必要ないことを考慮してください。特定の時間に必要な場合は、usingステートメントを明示的に使用できます。もう1つ注意が必要なのは、メモリの解放はコストのかかる手順です。多くの場合(特にメモリが多い場合)、GCにはパフォーマンス上の利点があります。メモリがリークされることはなく、割り当て解除に多くの時間を費やすこともありません。さらに、毎回1回だけメモリを割り当てるわけではないため、割り当ても速くなります。 newを呼び出すと、単に最後のオブジェクトポインタがインクリメントされます。
  • 「ガベージコレクションがあるという点でC#の方が悪い」。これは確かに主観的ですが、冒頭で述べたように、最新の一般的なアプリケーション開発では、ガベージコレクションは利点の1つです。
    C++では、newおよびdeleteを使用してメモリを手動で管理します。これは、経験的に常にあちこちでエラーを引き起こすか、または(C++ 11を使用)自動ポインターをネイティブで使用できますが、コードにロットと多くのノイズが追加されることに注意してください。したがって、GCにはまだエッジがあります。
  • 「ジェネリックスはテンプレートよりもずっと弱い」-どこからそれを得たのか私には分からない。テンプレートには利点があるかもしれませんが、私の経験では、一般的なパラメータの型チェック、反変、共分散ははるかに強力で洗練されたツールです。テンプレートの強みは、言語を少し操作できることです。これはかっこいいかもしれませんが、何かをデバッグしたいときに頭痛の種をたくさん引き起こします。つまり、全体として、テンプレートにはニース機能がありますが、ジェネリックの方がより実用的でクリーンです。
76
Yam Marcovic

環境

.NET FrameworkとWindowsクライアント

クライアントコンピュータでは、Windowsが主要なオペレーティングシステムです。 Windowsアプリケーションに最適なGUIフレームワークは、WinformsとWPFと。NET Frameworkを組み合わせたものです。 。NET FrameworkおよびそのAPIで使用するのに最適なプログラミング言語はC#です。 Javaはこれに代わるものではありません。また、C++は自動メモリ管理のない古い言語です。 C#はC++に似ていますが、自動メモリ管理を備えており、ポインタを操作する必要がないため、生産性が向上します。 C++は、場合によっては依然として最良のオプションですが、ビジネスで一般的なフォーム集約型のデータベースアプリケーションには適していません。

IISおよびWindowsサーバー

Windows環境とC#での作業に慣れている場合は、サーバープログラミングのIISと基本的な管理のWindows Serverを学ぶために最小限の投資が必要になります。

Active DirectoryおよびWindows Server

会社のネットワークに展開されるソフトウェアを開発している場合、Active Directoryを備えたWindowsサーバーを使用するWindows中心の環境を使用している可能性があります。このような環境では、C#および。NET Frameworkで作成されたソリューションを統合して展開するのが簡単です。

個人的に、私はC#開発者ではなくJava開発者ですが、Webを使用しています。 Windowsネットワーク用のネットワークアプリケーションを開発している場合は、C#に切り替えます。しかし、私はLinuxベースのWebサーバーにはJavaを好みます。依存関係があまりないのであれば、組み込みシステムにはC++を選択します。

はい、C#はC++やJavaよりも最新の機能を備えた優れた言語ですが、それはnotC#を選択する上で最も重要なことです。

概要

ソフトウェアの環境は、C#を選択する上で最も重要です。 Windowsクライアント、Windowsサーバー、Active Directory、IIS、そしておそらくSQL Serverがある環境で作業する場合、C#が最も優れた言語です。NET Framework

Unix環境で作業している場合Webサービス、Javaが私の選択です。また、組み込みシステムで作業する場合、またはハードウェアデバイスと統合する必要がある場合は、C++が適しています。

30
Jonas

C#およびJava

次の場合、C#は非常に優れた言語です。

  • 汎用オブジェクト指向開発を行いたい。それは古典的な静的型付けのOOP言語です。
  • あなたはMicrosoftプラットフォームのみをターゲットにしています(Microsoftが効果的にC =を作成するためにJavaを複製したことを覚えておくことは価値があります。人々が他のプラットフォームでアプリケーションを簡単に実行できるようにするでしょう...)

言語としてのC#はJavaよりも優れています(プロパティ、値の型、具体化されたジェネリックなどの構文が優れています)。言語としてC#を好みます) からJavaまでですが、大まかに言えば、かなり類似した言語であり、類似したアプリケーションに適しています。

一方、Javaには、いくつかの大きな利点もあります。

  • 巨大なオープンソースエコシステム-Javaのライブラリははるかにあらゆる言語で最高です。これの重要性を誇張するのは難しいです-物事を成し遂げるという観点から、Javaは非常に効果的です。
  • ツール-Javaツールは、.Netの世界を手に入れることができるものよりも優れていると思います。例:Maven(一度マスターしたら!)は特に印象的です。
  • 保守性-Javaは、かなり安定しており、後方互換性に多くの努力が払われてきたからこそ、大企業で成功してきました。シンプルでやや冗長な構文もヘルプJavaここ-コードが非常に明確で明示的である場合、コードの読み取りと保守が容易になります。
  • 新しい言語-JVMには、Javaプラットフォームの未来です。いくつかの驚くべき新しい言語(Scala、Clojure、Groovyなど)があります。ここで、言語革新の多くが起こっています。 JavaまたはC#のどちらよりも速く発生します。

つまり、Java vs. C#は非常に緊密な関係にあり、Microsoftキャンプに参加するか、オープンソース/クロスプラットフォームキャンプに参加したいかによります。

個人的に、私はJavaを好む:

  • ライブラリエコシステムは、C#がJavaよりも構文が優れているという事実よりもはるかに重要であると私は考えています。
  • 長期的には、すべてのコードが適切にクロスプラットフォームになり、クラウド上の安価なLinuxマシンの大きなクラスターで実行できるようにしたいと考えています。
  • Clojureは現在、私たちが世界で最も有望な言語である私見であり、JVMプラットフォームに固執すれば、時間の経過とともにコードとスキルをClojureに簡単に移行できます。

C/C++

C/C++は基本的にまったく別の獣です。私はではありません今日、次の理由により、汎用アプリケーション開発に推奨します:

  • メモリ管理-最近のほとんどの汎用プログラミングでは、自分のメモリを管理したくありません。 C#またはJavaでのガベージコレクションは、C/C++で使用する必要のある明示的なメモリ管理手法よりも生産性と健全性に優れています。
  • 複雑さ-特にC++は非常に複雑な言語です。習得には長い時間がかかり、コード自体も非常に複雑になる可能性があります。 (例えば、C++テンプレートは特に毛深いです...)
  • 生産性-ほとんどの場合、他のすべての条件が同じであれば、C/C++で作業を行うのに時間がかかります。

ただし、特定の限られた数の特別なドメイン、特に次の場合には、間違いなくすばらしい選択です。

  • オペレーティングシステム-オペレーティングシステムを作成している場合は、おそらくC/C++を使用します。
  • ゲーム開発-ほぼすべての最高の商用ゲームエンジンはC/C++です。要求の厳しいAAAタイトルを開発している場合でも、これは最良の選択です(C#とJavaは、要求の少ない/カジュアルゲームに最適です)
  • 高性能コンピューティング-最適化されたC/C++は、おそらく非常に高性能なコードを作成するための最良の方法です。このレベルの最適化を行うほとんどのアプリケーションにとって、努力する価値はありませんが、特定のドメインでは非常に価値があります(たとえば、高頻度取引)。
  • ハードウェアアクセス-ハードウェアに直接アクセスする必要があります(組み込みシステムなど)

したがって、基本的に、C/C++は、特に適しているドメインの1つに集中している場合にのみ、優れた選択肢です。

15
mikera
I heard that syntactically they are almost the same.

構文的に?だれが構文について空飛ぶサルを与えるのですか?構文が良いのは1つだけです。構文的に類似した言語からの移行を高速化できます。それでおしまい。

C#はJavaよりもはるかに優れています。汎用的で機能的なプログラミングサポートを検討してください。C#はJavaよりもはるかに優れています。演算子のオーバーロードはもちろんのこと、その他の優れた機能-C#のほうがはるかに優れています。 JavaがC#よりも優れていると考えられる可能性はありません。

C++とC#はもっとコンテストです。 C++には、非常に迷惑な古風なコンパイルモデルとCのレガシーdiseasesの束がありますが、テンプレートはジェネリックよりもはるかに強力であり、リソース管理アプローチは、usingのように、一般にはるかに柔軟で強力です。完全な失敗であり、より速く実行されます。

13
DeadMG

C#には、LINQやデリゲートなどのいくつかのNice組み込み機能があります。 JavaC++の両方の世界で最高のものになっています。完全な比較については ここ を参照してください。

しかし、私はJavaの世界のほうが好きです-より多くのオープンソースフレームワークがあり、すべてのプラットフォームで動作します。そして、Monoについて私に言わないでください-これは信頼できるオプションではありません。

7
Petar Minchev

一部の情報源によると(例 http://www.indeed.com/jobtrends を参照)、C#はJavaよりも人気が低く、C++ほど人気が​​あります。

C#は、Javaにない機能を提供します。たとえば、プロパティや関数型プログラミングスタイルなどの特定のプログラミングイディオムを直接サポートします。C#はC++よりも高いレベルの抽象化を備えています。これは、開発時間はプログラムの速度よりも重要です。

個人的には、私は今でもJava/C++の世界を好みます。PetarMinchevが言ったように、Javaにはオープンソースのフレームワークとアプリケーションが多く、どこでも実行され、少ないです特定のベンダーとオペレーティングシステムに関連付けられています。C++には同様の利点があります。ただし、コードがあるプラットフォームから別のプラットフォームに移行する必要がある場合がよくあります。私はLinuxで開発することを好むので、私の知る限り、LinuxでC#を本格的に開発することはできません。私のプログラミングのニーズはC、C++、Java、Scalaでカバーされているため、C#に本当の関心を得たことはありません。

一方、多くの開発者にとって、特定のベンダーに縛られることは問題ではありません。Microsoftはオペレーティングシステム市場で支配的な地位を占めており、C#は多くの仕事の機会を与えます。したがって、IMOの多くの開発者はC#を採用しています。これは、機能が豊富な言語であるだけでなく、投資にも適しているためです。

3
Giorgio

「プログラミング言語を含む、どのソフトウェア開発フレームワーク」についてはどうですか?

作業する「環境」など、他のものを含めるのを忘れました。

  1. Windows O.S.のみで作業する予定ですが、低レベルである必要はなく、メモリやその他のリソースが大量にある必要はありませんか?

    Windows上のフレームワークとして.NETを選択し、C#を使用します。

  2. あなたはWindowsだけで作業するつもりですが、低レベルである必要はありませんが、リソースが多くありませんか?

    Delphiフレームワーク(およびObject Pascal Delphiプログラミング言語またはLazarus Object Pascalプログラミング言語)を選択します

  3. あなたのアプリです。さまざまな携帯電話でゲームなどのいくつかのプラットフォームをサポートする必要がありますか?

    Javaフレームワーク、およびJavaプログラミング言語を選択します。

  4. それはグラフィックインターフェースとしてKDEを備えたLinuxですか?

    C++でQTフレームワークを選択する

  5. Gnomeをグラフィックインターフェイスとして備えたLinuxですか?

    C++でGObject/GLibフレームワークを選択する

  6. ドライバーの開発など、多くの低レベルの操作を行う予定ですか?

    プレーンCまたはC++は、いくつかのオペレーティングシステムで使用され、標準ライブラリをフレームワークとして使用します。

ちょうど私の2セント。

3
umlcat

検索を行うと、トップのプログラミング言語に関する議論に出くわす可能性があります。これは検索結果の1つです- http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html -Javaまだ最も人気のある言語のようです。

JavaはC++の欠点のいくつかを取り除こうとしました(そして、非リアルタイムで重要ではないアプリケーションのプログラマーの生活をシンプルにしました)。 C#はパーティーの後半に来て、Java言語のいくつかの欠点を回避しました。C#は(Microsoftが多くの制御を行っているため)多くの進歩を遂げ、= Javaは、利害関係者間の対立のため、かなりの期間ブロックされました。

1
Satyajit

まだ言及されていないいくつかのこと:

次の理由により、C#はC++よりも優れています。

ヘッダーファイルがなくなるため、非常にシンプルになります。

C#はJavaより優れています。

これは、参照型(クラス)と値型(構造体)の両方のユーザー定義型をサポートします。これは、何をしているのかがわかっている場合に、パフォーマンスを大幅に向上させることができます。

単一メソッドインターフェイスのようなデリゲートをサポートしているため、単一メソッドオブジェクトを含む頻繁に発生する構造のコーディングを大幅に簡略化します。

1
Mike Nakis

予想される環境と専門知識に最適な言語を選択する必要があります。

Microsoftのみの環境で作業している場合は、C#を選択します。 C#はISO/IEC 23270:2003で標準化されていますが、Microsoftのバージョンが唯一の完全な実装のままです。言語のいくつかの重要な部分は標準でカバーされていないため、Microsoftの特許の対象となっています。他のシステム用に完全に互換性のあるバージョンの言語を他の人が実装することはないため、実際には、その言語を使用している限り、ベンダーはMicrosoft Windowsおよび.Netにロックされています。モバイル市場で使用するスキルを探している場合は、別の言語を探すのが最善です。

Javaは機能しますが、一部にはガベージコレクションなどの機能が原因で、かなりのオーバーヘッドがあります。 JavaもISO/IECで標準化されていないため、Javaのプラットフォームとバージョンを切り替えるかどうかは保証されません。Sun/ Oracleの最善の意図のみです。最終的にAndroidでの作業を計画している場合は、 Androidのプログラミングは基本的にJavaで、いくつかの変更点があります。

C++は標準化されており、ほとんどすべてのコンパイラは国際標準に準拠しているため、動作は保証されていますが、言語によって保護されるわけではありません。自分でクリーンアップとオーバーフローのチェックを実行する必要があります。これは難しいことではありません。 C/C++プログラマーは長年これらを行ってきました。 AppleはすべてにObjective Cを使用しているため、Appleを目指す場合は、代わりにこれを試すことをお勧めします。

ある時点でWindowsを置き去りにしているのに気づいたら、C/C++とJava-どちらも現時点では市場に出回っている)の両方を学ぶことをお勧めします。

1
T.J.

C++とC#の比較(Javaで十分ではないため)では、Windowsで低レベルのものにアクセスする機能がありません。たとえば、C#では(まだ)ネイティブディスプレイドライバーを開発できませんが、C++では開発できます。これはC++をより良くするものではありません。 C++対C#は、アセンブリ対Cと見なされます。

実際に機能を実装するのにかかる時間を見ると、C#の方がはるかに効率的です。 .Netランタイムのパフォーマンスの低下は、開発されたアプリケーションの99%では無視できます。タイトなループを実行している場合、それは重要な場合があります。必ずそうですが、ほとんどの場合、アプリケーションはアイドル状態で、あらゆる種類の入力、信号、または割り込み(ディスクIO、ボタンのクリック、ネットワーク、アニメーションの完了)を待機しています。 。

彼のすべての機能を備えたCLRライブラリには、もう1つの大きな利点があります。ジュニア開発者にC#をトレーニングしていたとき、ほとんどの開発者は、クラス、メンバー、名前空間の論理的な命名規則が好きだと言っていました。メソッドの機能を見つけることはSDK全体で論理的であり、Visual Basic 5には深刻な欠陥がありました。これは彼らがライブラリを採用するのに非常に役立ちました。言語の構文を学習した後、新しいライブラリを学習することは、SDKをよく理解するために重要です。それはあなたが車輪を再発明することからあなたを救います。

0