Я хочу знать, как изменить порядок выполнения при построении цепочек конструкторов в 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 ().
Итак, мой вопрос: как можно управлять порядком вызова конструктора при построении цепочки конструкторов, а не с помощью синтаксиса двоеточия, который может сначала вызвать только другой конструктор?