スポンサーリンク

.Net Framework におけるスタックとヒープ

C#

スタックとヒープについてザックリ表現すると、スタックで書かれたプログラムはメモリー上に保持され、ヒープで書かれたプログラムはハードディスクに保持される。という違いがあります。

ハードディスクに比べて、メモリーの処理速度は十倍から百倍くらい速いので、ヒープで書かれたプログラムより、スタックで書かれたプログラムは、十倍から百倍くらい速いと言えます。

VCや、VC++で開発していた10年位前は、可能な限りスタックで処理することを、シビアに求められていましたが、.Net Framework が主流になってからは、あまり聞かなくなりました。

しかし、スタックとヒープの概念は、最新版の .Net Framework にも存在しているので、スタックの力を上手く引き出せば、高速なアプリケーションを開発する事ができます。

スタックを使っているかどうかで、「あの人の作るプログラムは速い!」と言われるか、「あいつのプログラムは遅い!」と言われる違いを生みますので、プロフェッショナル・プログラマーを目指す方には、必須の知識だと言えます。

スタックプログラムをC#で記述する場合、定数と共通処理が対象となり、static class(静的クラス)で表現します。
何度も呼ばれる処理を、静的クラスで定義する事で、プログラムのパフォーマンスを改善するのは、プロフェッショナル・プログラマーの定石だと言えます。

C#で例を示しますが、VB.NETでも同様です。

1.静的クラスで記述した定数の、具体的なソースを以下に示します。

【定義例】
public static class C_画面最小サイズ
{
    public const int メイン_縦 = 768;
    public const int メイン_幅 = 1024;
}

【使用例】
int a = C_画面最小サイズ.メイン_縦;

2.静的クラスで記述した共通処理の、具体的なソースを以下に示します。

【定義例】
public static class C02業務共通処理
{
    private static string CSV規定書式変換(string field)
    {
        string ret = field;
        if ((field.IndexOf('"') > -1)
            || (field.IndexOf(',') > -1)
            || (field.IndexOf('\r') > -1)
            || (field.IndexOf('\n') > -1)
            || (field.StartsWith(" "))
            || (field.StartsWith("\t"))
            || (field.EndsWith(" "))
            || (field.EndsWith("\t")))
        {
            if (field.IndexOf('"') > -1)
            {
                //"を""とする
                ret = field.Replace("\"", "\"\"");
            }

            ret = "\"" + field + "\"";
        }

        return ret;
    }
}

【使用例】
string value = CSV規定書式変換(grid.Columns[iCol].HeaderText);

スタックが静的クラスなのに対して、ヒープは動的クラスで記述します。
動的クラスは、new メソッドでインスタンスを生成しないと、使用できないのが特徴です。
フォームのように、static が宣言されていない class は全て動的クラスです。

動的クラスで記述されたフォームの具体的なソースを以下に示します。

【使用例】
_502スタッフ詳細 _502スタッフ詳細 = null;
_502スタッフ詳細 = new _502スタッフ詳細();
_502スタッフ詳細.ShowDialog();

コメント

タイトルとURLをコピーしました