JavaやC ++よりもC#を選択する理由は何ですか?[閉まっている]


46

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


16
書かれているように、質問は建設的な「どちらの言語の方が良いですか?」という教科書の例でした。ここでトピック外の質問。実際によく考え抜かれた答えが得られたので、私は編集でそれをより建設的にしようとしました。それでも、この種質問をするときは、FAQこのブログ投稿を念頭に置いてください
アダムリア

エッジの効いたアイテムをいくつか追加します。.NETにはその言語用に明確に定義されたDOM(CodeDOMなど)があり、その結果、実行時に動的に物事を生成する方がはるかに簡単で効率的です。これは、インフラストラクチャ機能としても役立ちます。また、型システムには、すべてのネイティブW3型と1対1の一致があります。中核として、W3およびその他の相互運用機能は最初から言語に組み込まれていました。他の言語の場合、これらの懸念はボルトで固定され、多くの課題を提示します。あなたは、その後の言語および/またはプロトコルの多くとinteropingされます場合にも、.NETにも非常に強いです
JoeGeeky

5
ねえ、JoeGeeky、質問への回答としてコメントを追加します。
アンソニーマストリアン

1
実際の質問は次のとおりです。C#よりもNemerle、F *、およびF#を選択する理由は何ですか。(すなわち、すべての3つの言語がMSからのものであり、3つのすべてが優れている)
mrsteve

「言語/プラットフォームXは言語/プラットフォームYに比べて常に優れている」というジャンルの声明は本当に有効ではないと思います。この質問のポイントは何ですか?
シヴァンドラゴン

回答:


76

質問は「どの言語が現代の典型的なアプリケーション開発により適しているか」でなければなりません。

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

だから私の頭の上(いくつかの引数は両方の言語に適用されます)...

その点で、C#はC ++よりも優れています。

  • それは持っているネイティブ ガベージコレクションを。
  • クラスメソッドのシグネチャを自由な関数として扱う(つまり、静的に型指定されたthisポインター引数を無視する)ことができるため、クラス間のより動的で柔軟な関係を作成できます。これが何を意味するのかわからない場合は編集してから、void (*ptr)()変数にvoidを返し、voidを受け入れるメンバーメソッドを割り当ててみてください。C#デリゲートはthisポインターを持ちますが、ユーザーは常にそれを気にする必要はありません。void()クラスのメソッドを他のvoid()デリゲートに割り当てることができます。
  • とても便利で使いやすい、非常に便利なものを備えた巨大な標準ライブラリがあります。
  • マネージコードブロックとネイティブコードブロックの両方を使用できます。
  • アセンブリのバージョン管理は、DLLの問題を簡単に修正します。
  • クラス、メソッド、およびフィールドをアセンブリ内部に設定できます(つまり、宣言されている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 ++ほどCIIではRAIIを必要としないことを考慮してください。必要な特定の時間に、明示的にusingステートメントを使用できます。もう1つの注意点:メモリの解放は高価な手順です。GCには、多くの場合(特にメモリが多い場合)にパフォーマンス上の利点があります。メモリがリークすることはなく、割り当て解除に多くの時間を費やすこともありません。さらに、メモリは毎回割り当てられるわけではなく、たまにしか割り当てられないため、割り当ても高速になります。呼び出しnewは、単に最後のオブジェクトポインターをインクリメントすることです。
  • 「C#はガベージコレクションを持っているという点で悪いです」。これは確かに主観的ですが、冒頭で述べたように、最新の典型的なアプリケーション開発では、ガベージコレクションは利点の1つです。
    C ++では、経験的に常にあちこちでエラーが発生するand を使用newしてメモリを手動で管理するかdelete、(C ++ 11で)オートポインターをネイティブで使用できますが、多くの追加が行われることに注意してくださいコードへのノイズの。したがって、GCにはまだ優位性があります。
  • 「ジェネリックはテンプレートよりもずっと弱い」-どこから入手したのかわからない。テンプレートには利点があるかもしれませんが、私の経験の制約では、一般的なパラメーターの型チェック、反分散、共分散は非常に強力でエレガントなツールです。テンプレートの強みは、言語で少し遊ぶことができるということです。これは素晴らしいかもしれませんが、何かをデバッグしたいときは頭痛の種でもあります。全体として、テンプレートには優れた機能がありますが、ジェネリックはより実用的でわかりやすいと思います。

5
まだC ++のガベージコレクターが必要な場合は、ダウンロードできます
fredoverflow


6
Javaと比較したC#のもう1つの重要な機能は、パフォーマンス上の理由から、スタック(または特殊な場合はCPUレジスタ)に保存できる、または他のヒープオブジェクトに埋め込むことができるオブジェクトの種類です。X、Y座標ペアなど、1〜4フィールドの小さなオブジェクトによく使用されます。
クワーティー

2
@LokiAstari Mindは説明していますか?イベントハンドラーの登録を解除し、ネイティブラッパーを含むクラスでDisposeパターンを使用することを忘れない限り、問題はありません。これは、C ++でのメモリ管理よりも、知って覚えておくべきことがはるかに少ないです。
ヤムマルコビッチ

2
-1「C ++はその点でC#よりも優れています...」および「JavaはC#よりも優れています...」のセクションがないためです。私はC#がすべての分野で優れているとは思わないので、これらの2つのセクションのない答えにはおそらくいくつかの重要な情報が欠けています。
ジョルジオ

30

環境

.NET FrameworkおよびWindowsクライアント

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

IISおよびWindows Server

Windows環境でC#を使用している場合は、サーバープログラミング用のIISと基本的な管理用のWindows Serverを習得するのに最小限の投資で済みます。

Active DirectoryとWindowsサーバー

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

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

はい、C#はC ++やJavaよりも最新の機能を備えた優れた言語ですが、それはC#を選択するための最も重要なものではありません

概要

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

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


3
絶対に-これが、私がC#を使用する理由であり、実際には他の理由ではありません
マーフ

確かに、Mono、MonoTouch、MonoDroidを介して他のプラットフォームで.NETを使用できますが、私のベンチマークでは、MonoはWindows用の.NETよりもかなり遅く、MicrosoftのCompact FrameworkはWindows CEでは非常に遅いことがわかりました:codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ...もちろん、WPFはWindowsでのみ使用できます(しかし、とにかく好きではありません。)
Qwertie

「組み込みシステムにC ++を選択するのは、多くの依存関係がなければ、どの依存関係ですか?」Javaライブラリを意味しますか?
パックル

@Pucklはい、しかしほとんどはjvm / jreです。
ジョナス

「WebサービスなどのUnix環境で作業している場合」と考えられる他の言語とフレームワークがあります
。ruby

15

C#とJava

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

  • 汎用のオブジェクト指向開発を行いたい。これは、古典的な静的に型付けされたOOP言語です。
  • Microsoftプラットフォームのみを対象としています(MicrosoftがJavaを効果的に複製してC#を作成したことは、Javaに似た言語でWindowsをロックしたかったためです。Javaを使用できたかもしれませんが、他のプラットフォーム....)

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

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

  • 巨大なオープンソースエコシステム-無料で入手できるJavaのライブラリは、どの言語よりもはるかに優れています。これの重要性を誇張するのは難しいです-物事を成し遂げるという点から、Javaは非常に効果的です。
  • ツール-Javaツールは、.Netの世界を手に入れることができるものよりも優れています。たとえば、Maven(一度マスターしたら)は特に印象的です。
  • 保守性-Javaはしばらく前から比較的安定しており、下位互換性に多大な労力を費やしてきたため、大企業で成功しています。シンプルでやや冗長な構文もここでJavaに役立ちます。コードが非常に明確で明示的であれば、コードの読み取りと保守が容易になります。
  • 新しい言語-JVMには、Javaプラットフォームの未来である驚くべき新しい言語(Scala、Clojure、Groovyなど)がいくつかあります。これは、言語の革新の多くが行われている場所であり、JavaまたはC#のいずれよりもはるかに速く行われています。

したがって、Java対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つに焦点を合わせている場合にのみ、素晴らしい選択です。


1
Javaの優れたツールの例として、mavenに言及しています。私はそれを特に知っているわけではありませんが、ドキュメントを見ると、Mavenはネイティブの.NetビルドツールMSBuildに似ています。MavenがMSBuildより優れているのはなぜですか?
ケビンキャスカート

1
+!(私が1票しか持っていないという理由だけで):Javaエコシステムが優れている理由と、C#とJavaの構文のみを比較してはならない理由を非常によく説明しています。Javaには、より優れたライブラリとツールがあります。Java言語自体ではそれほど大きな変化はありませんが、C#よりも(IMO)はるかに興味深い新しい非常に興味深い言語がJVMに登場しています。私はClojureを知りませんが、Scalaは非常に興味深いと思います。最初からOOP + FPとして設計されています。
ジョルジオ

2
誰もがC ++コードが手動のメモリ管理でいっぱいだと考えるのはなぜですか。ご存知のCではありませんが、RAIIはメモリを手動で割り当て/解放する必要がほとんどないことを意味します(C#のような言語が役に立たない場合があります)。
gbjbaanb

3
@gbjbaanb-おそらくRAIIは汎用メモリ管理には不十分だからです。JavaやC#で見られるような完全なGCシステムと同等の柔軟性はありません。RAIIの範囲を超えるとすぐに、手動のメモリ管理領域に戻ります。
ミケラ

3
@mikera .NETプラットフォームでもかなりの言語開発が行われていることを指摘したいだけです。例えば、F#は.NETの残りをスムーズに統合するきちんとした関数型言語であり、Pythonは最近、Iron Pythonとして.NETに移植されました(そして素晴らしいIDEも手に入れました!)。
ikh

13
I heard that syntactically they are almost the same.

構文的に?誰がシンタックスについて空飛ぶ猿を与えますか?構文が唯一良いのは、構文的に類似した言語からより高速に移行できることです。それでおしまい。

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

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


6
言語機能と異なるプラットフォームでの言語の可用性の両方を比較する必要があると思います。C#ではMicrosoftにロックインされますが、Javaではロックインされません。少なくともUNIX / Linux開発者にとっては大きな利点です。OOP + FPはクールな機能ですが、JVM上で実行され、レガシーJavaコードとインターフェイスできるScalaを使用できるのに、なぜC#に悩まされるのですか?強制されない限り、プラットフォーム固有の言語を学ぶことはありません。
ジョルジオ

2
@Giorgio:Monoプロジェクトは存在します。しかし、第二に、Microsoftは実際にプラットフォームの面倒を見ます。定期的に大規模なアップグレードを行っています。Javaには新しいものはほとんどありません。また、質問はC#対Javaについてであり、CLR対JVMについてではありません。
DeadMG

4
@DeadMG:私の知る限り、Windowsで開発されたC#プログラムをMonoでビルドすることはできません。CLRとJVMではありませんか?問題は、なぜ人々がC#またはJavaを使用するかについてです。言語を使用するには、ランタイムとオペレーティングシステムが必要です。C#にはJavaよりも多くの機能があるという事実については説明しませんが、Javaの方がはるかに移植性があります。これは、言語の採用に影響を与える要因です。実際、Javaは特定の高度な機能が欠けていても、C#よりもはるかに頻繁に使用されます。
ジョルジオ

3
@Giorgio、任意のC#プログラムをMonoでビルドできます。特定のライブラリ(とにかくC#言語の一部ではない)は使用できません。また、javaは「はるかに移植性が高い」わけではありません。C#でiOS向けにコーディングすることはできますが、たとえばJavaではできません。
SKロジック

2
@ Giogio、Monoは少なくともJVMと同じくらい移植性があります。
SKロジック

7

まあ、デリゲートのC#ようないくつかの素晴らしい組み込み機能がLINQあります。これは、両方の世界から最高を得ている- JavaC++。完全な比較についてはこちらご覧ください。

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


9
+1:「しかし、私はJavaの世界のほうが好きです。はるかに多くのオープンソースフレームワークがあり、すべてのプラットフォームで動作します。」オラクルがこれを変えないことを願いましょう!
ジョルジオ

15
説明してください、Monoで「信頼できる」ものは何ですか?
SKロジック

2
@Petar Minchev、それはあなた自身のせいです。移植性のガイドラインに従う必要があり、移植性のないライブラリを使用しないでください。この方法では、Monoで複雑なアプリケーションを確実に実行できます。WPFのようなものは決して移植されません。
SKロジック

2
@Petar Minchev、移植性のないJavaライブラリがたくさんあります。使用する言語に関係なく、常に移植性に注意する必要があります。とにかく、問題は言語に関するものであり、サードパーティのライブラリではありません。
SKロジック

3
@Petar Minchev、GTK#は移植可能です。代わりに使用してください。
SKロジック

3

いくつかの情報源(例えば、http//www.indeed.com/jobtrendsを参照)によると、C#はまだJavaよりも人気が低く、C ++と同じくらい人気があります。

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

個人的には、私はまだJava / C ++の世界を好みます。Petar Minchevが言ったように、Javaにはオープンソースのフレームワークとアプリケーションが多くあり、どこでも実行でき、特定のベンダーやオペレーティングシステムにあまり縛られていません。C ++には同様の利点がありますが、コードはしばしば1つのプラットフォームから別のプラットフォームへの適応を必要とします。私はLinuxでの開発を好み、私の知る限り、LinuxでC#を本格的に使用することはできないので、プログラミングのニーズはC、C ++、Java、Scalaでカバーされているため、C#に興味を持ちませんでした。

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


「LinuxでC#を本格的に使用することはできません」-これについて詳しく説明してください。LinuxでC#言語自体(またはF#)の問題に遭遇していないため、完全な.Netフレームワークを利用できないということですか?
ウェズリーワイザー

@wawa:私の知る限り、.NetフレームワークはJDKに対応しており、.NetフレームワークはWindowsでのみ使用できますが、JDKはいくつかのOSで使用できます。これが正しくない場合、回答を編集できます(また、意見も変更できます)。
ジョルジオ

1
近い類似性は、JDKの基本クラスライブラリだと思います。BCLには、標準化されたパーツと標準化されていないパーツがあります。モノプロジェクトは、標準化されていない部分と同様に、標準化された部分も実装します。
ウェズリーワイザー

@wawa:情報をありがとう。Monoを使ってC#を試してみることを検討しています。それでも、JavaがOracle(または以前はSun)よりもC#がMicrosoftとずっと強く結びついているという強い印象を今でも持っています。
ジョルジオ

3

「プログラミング言語を含むソフトウェア開発フレームワーク」の方が良いでしょうか?

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

  1. Windows OSのみで動作しますが、低レベルである必要はなく、多くのメモリやその他のリソースがありますか?

    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セントです。


1
3についてはよくわかりません。スマートフォンは今日非常に人気があり、私の知る限り、それらはすべて何らかの形でC#をサポートしていますが、Javaのみをサポートしています。
svick

Delphiは死んでいませんか?:)
šljaker

@šljakerいいえ、しかし、最近はあまり人気がありません。
umlcat

1
@svick:それは嘘です。Androidのほかに、JavaはiOS、Symbian、WinMo、Blackberry、Maemo、およびWebOSにも何らかの形で存在します(つまり、重要なことや重要なことはすべて、さらに小さなプラットフォームで始めないでください)。Android、Blackberry、およびSymbian は、開発オプションとしてJavaを公式にサポートしています。SunはiOSでJavaをサポートしていましたが、Appleはそれを好みません。Javaは、AndroidおよびBlackberry電話の主要な開発言語です。C#についても同じことは言えません。AFAICTはWinMoで公式にサポートされているだけです。
ライライアン

1

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

Javaは、C ++の欠点のいくつかを除去しようとしました(そして、非リアルタイムおよび非クリティカルなアプリケーションのプログラマーの生活をよりシンプルにします)。C#はパーティーの後発者であり、Java言語のいくつかの欠点を回避しました。Javaの進歩は、その利害関係者間の衝突によりかなりの期間ブロックされましたが、C#は(Microsoftが多くのコントロールを持っているので)多くの進歩を遂げました。


1

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

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

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

C#はJavaよりも優れています。理由は次のとおりです。

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

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


参照型と値型の両方を使用すると、C#でパフォーマンス上の利点が得られる方法を説明できますか?
ジョルジオ

たとえば、レコードの配列が必要な場合、Javaでは、クラスを使用してレコードを記述する以外に選択肢はないため、配列は、個別に割り当てられた多数のオブジェクトへの参照の配列になります。あなたの配列は、あなたの構造だけC.のように次々を含むメモリのただ一つの連続した領域になりますので、C#では、あなたは、構造体を使用して、レコードを記述することができます
マイクNakis

別の例として、小さな新しいタイプ(機械語に収まるタイプ)を定義する場合、新しいクラスを定義する必要はありません。単純に構造体にすることができるため、値のセマンティクスに従います。そのような構造体を渡すことは、オブジェクトへの参照を渡すことよりも高価ではありませんが、オブジェクトの割り当て、構築、およびガベージコレクションを行わないという利点があります。
マイクナキス

わかります。したがって、クラスはヒープ上でインスタンス化され、参照を介してアクセスされますが、構造体はスタック上でインスタンス化されます(?)
ジョルジオ

ほぼ正しい。このステートメントの唯一の不正確さは、別のオブジェクト内に埋め込まれている場合、または構造体の配列内にある場合、ヒープ上に構造体が見つかるということです。また、Javaで値型がボックス化されるのとまったく同じ方法で、ボックス化されるとヒープ上でも検出されます。
マイクナキス

1

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

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の両方を学ぶことをお勧めします-両方とも現時点で販売可能です。


0

C ++とC#の関係(Javaの習熟度が低いため)で、ここで欠けているのは、Windowsで低レベルのものにアクセスできることです。たとえば、C#(まだ)でネイティブディスプレイドライバーを開発することはできませんが、C ++ではできます。これはC ++を改善するものではありません。C ++とC#をアセンブリとCと見なします。

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

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

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