C#

C# はC++ 言語を基本に進化した新しいプログラミング言語であり、オブジェクト指向のフレームワークでもあります。 実際、Java とC++ のイイトコ取りの印象を受けます。
更新日 2016-02-13

概要

VisualStudio2008 にVisual C# は同梱されています。VisualC++ での開発経験があり、なおかつJava を知っていれば勘を頼りに すぐ使いこなせるようになります。なぜならC# は、まさにC++ とJava の二つをイイトコ取りして出来上がった言語とも言えるからです。 開発環境も大きく進化しており、おそらくこれはVisualBasic で培われたノウハウが採用されていると思われます(自分はVBを ほとんど知らない(汗))。
C# を学ぶ事はC++ を否定する事ではありません。むしろC++ で培った経験を十分に発揮できる将来性のあるプラットフォームです。 多少の歯痒さも直ぐに消えてなくなるでしょう。新しい言語を自分のものにできる喜びは、まさにプログラマ冥利に尽きると言えます。

実行速度

Java 同様、.Net フレームワーク上で動く為か、C++ に比べると遅くなります。しかしCPU パワーが潤沢な現在では、一般的な アプリケーションにおいては差異はあまり感じられません。またポインタを使う事も可能なので、それなりに改良が可能です。 しかし負荷の高すぎる処理はC++ で書いておいてDLL などで呼ぶ事になると思われます。

開発効率

.NET framework には完成された汎用ライブラリが山ほどあり、これを容易に扱う事ができるために開発効率が素晴らしく向上します。MFC に比べると コーディングのコストが大幅に軽減されています。

ガーベッジコレクタ

C#ではオブジェクトの生存について意識する必要がありません。全ての参照が失われたインスタンスは、自動的に消されます。

Dispose について

Dispose はインスタンスの破棄を明示的に宣言するメソッドです。適切にインスタンスを使っていれば、あえて呼び出す必要はありません。
自作クラスにおいて、C#にはデストラクタが無い為にC++のように後処理する事ができません。後処理用メソッド(例えばclose のような)を 準備して、明示的に呼び出す事にします。(個人的にはコチラを推奨)
using ステートメントを用いると、そのスコープを抜ける際にDispose メソッドを(実装されていれば)自動的に呼び出す事ができます。(どうしても デストラクタ代わりに使いたいのであれば、この方法か?)

追記

Dispose というとFileStream とかが必ず例に出されるが、そもそもオープンと対になるクローズを呼び忘れてる点こそが問題だと思う。

Dispose を明示的に呼ぶべきか?

.Net Framework から提供される全てのインスタンスはDispose を明示的に呼ばなくても、参照を全て失った時点で廃棄処分されます。ただし、ガーベッジコレクタに よって削除されるまで時間がかかります。Dispose を呼ぶ場合と呼ばない場合では、前者に比べ後者の方がメモリを多く消費します。(もちろんある程度膨れると ガーベッジコレクタがまとめて仕事して、一気に小さくなる。そもそも多く消費する事が許されるからそうなのであって、そうでなければ早期に回収されるハズ)
また同じクラスのインスタンスを大量に一方的に生成する時など、不要になった古いインスタンスが再利用される為、メモリ消費がある一定以上は増えてきません。
Bitmap やRegion やFont やPen など、メモリリーク防止としてDispose が明示的に呼ばれるコーディングが随所で見られますが、無くても構いません。参照が失われた インスタンスはちゃんと回収されます。百聞は一見にしかず。簡単なループテストプログラムとタスクマネージャで確認できます。(ただしDispose を呼ぶとガーベッジコレクタは こまめに働くようで、最初からメモリ消費はさっぱり増えない。精神衛生上も良いし、賢いプログラムな気もしますが、それが本当にガーベッジコレクタにとって 好ましいのかどうかは疑問です。)

new Bitmap(filename) でファイルロック

Dispose() が呼ばれるまではファイルが(書き込み)ロックされてしまいます。これをあえて使わず、FileStream 経由するのが無難な気もします。 ちなみにDispose() を明示的に呼び出さなくても、参照の失われたインスタンスはちゃんとガーベッジコレクタによってDispose() が呼ばれます。(ただしそれがいつ行われるかは ガーベッジコレクタの気分次第です)
Bitmap bmp = new Bitmap("D:\\aaa.bmp");

// ダメな例
this.m_bmpBackGround = bmp;
this.m_bmpBackGround = (Bitmap)bmp.clone();

// 適切 に動く
this.m_bmpBackGround = new Bitmap(bmp);
bmp.Dispose();
{
	Bitmap bmp = new Bitmap("D:\\aaa.bmp");
}
System.GC.Correct();
Dispose() が呼ばれないのでロックも解放されない。System.GC.Correct() は本当の強制ではないのでスルーされてます。しかし大量のインスタンス作成や廃棄を 続けて行っていると、ある時Dispose() の対象となり、ロックも解除されます。

以前のガーベッジコレクタ

サイトを見渡すと、どうも以前は下記のコードがうまく動かなかったようですね。
Random rnd = new Random();
for (int i = 0; i < 80000; i++)
{
	Bitmap bmp = new Bitmap(rnd.Next(1000) + 1000, rnd.Next(1000) + 1000);
}
.Net Framework 3.5 + VS2008 + Vista [2009/06/02] の時点では正しく動きました。 メインスレッドでもワーカースレッドでも、メモリ消費が一定に達すると適宜ガーベッジコレクタが 発動しています。(.Net 2.0 + Windows2000 でも問題にはならないような。バグだったのかな)