C#でコンストラクターをチェーンするときに実行順序を変更する方法を知りたいです。私が見た唯一のメソッドでは、現在のコンストラクターの外部で、チェーンコンストラクターを最初に呼び出す必要があります。
具体的には、次の例を見てください。
public class Foo {
private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
private Thing myThing;
public Foo(string name) {
doSomeStuff();
if (ThingCache.ContainsKey(name)) {
myThing = ThingCache[name];
} else {
myThing = ExternalStaticFactory.GetThing(name);
ThingCache.Add(name, myThing);
}
doSomeOtherStuff();
}
public Foo(Thing tmpThing) {
doSomeStuff();
myThing = tmpThing;
doSomeOtherStuff();
}
}
理想的には、これを行うことでコードの繰り返しを減らしたいと思います(この不自然な例では、あまり多くのコードが保存されていないことを認めますが、はるかに有益なコードで作業しています。わかりやすくするためにこの例を使用します):
public class Foo {
private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
private Thing myThing;
public Foo(string name) {
if (ThingCache.ContainsKey(name)) {
this(ThingCache[name]);
} else {
this(ExternalStaticFactory.GetThing(name));
ThingCache.Add(name, myThing);
}
}
public Foo(Thing tmpThing) {
doSomeStuff();
myThing = tmpThing;
doSomeOtherStuff();
}
}
これはVB.Netで可能ですが、C#では、別のコンストラクターの途中でコンストラクターを呼び出すことはできません。最初にFoo():this()構文を使用する場合のみです。
だから私の質問は、最初に他のコンストラクターを呼び出すことしかできないコロン構文を使用するのではなく、コンストラクターをチェーンするときにコンストラクターを呼び出す順序をどのように制御するのですか?