メソッド単位の変数管理

http://d.hatena.ne.jp/yaneurao/20060506#p1
やねうらおさんのコメントから。

例えば、特定のメソッド内から参照しないprivateなメンバ変数を、そのメソッド内で宣言できる構文
例)
member int i;
のようなものも欲しいです。

私は、ある処理書くとき必要となる変数群、関連するメソッド群のみの集合を考え、collaborationというようなひとつの単位でとらえています。collaborationは一箇所に集中して記述できるべきだと思います。

ここで述べられているメソッド固有のメンバ変数はC/C++のstatic変数に近いものだと思います。メソッド単位で状態を管理したい場合、C#だとクラスを作成しなければならず、それなりに面倒です。
メソッド単位のメンバ変数の管理ですが、先ずはネーミングルールを用いる場合。

using System;

class Foo {
    int for_func_a;
    int for_func_b;

    public int FuncA () {
        return ++for_func_a;
    }

    public int FuncB () {
        return ++for_func_b;
    }
}

うーむ、解決になっているのかしら?(^^;

次に手を抜かず、クラスに分割してみましょう。

using System;

class FooA {
    int for_func_a;
    public int FuncA () {
        return ++for_func_a;
    }
}

class FooB {
    int for_func_b;
    public int FuncB () {
        return ++for_func_b;
    }
}

class Foo {
    FooA foo_a = new FooA ();
    FooB foo_b = new FooB ();

    public int FuncA() {
        return foo_a.FuncA ();
    }

    public int FuncB() {
        return foo_b.FuncB ();
    }
}

正攻法ですが、ちまちま委譲処理を書くのが面倒です。委譲構文ください>ヘジたん。

最後に邪道。

using System;

delegate int Func();

class Foo {
    public Func FuncA = Foo.MakeFuncA ();
    public Func FuncB = Foo.MakeFuncB ();

    static Func MakeFuncA () {
        int a = 0;
        return delegate { return ++a; };
    }

    static Func MakeFuncB () {
        int b = 0;
        return delegate { return ++b; };
    }
}

匿名メソッドを使ってクラスの作成をコンパイラに押しつけました。hackなんで、分かり難くなること請け合い。(^^;