Цепочка конструкторов C # - изменение порядка выполнения

Я хочу знать, как изменить порядок выполнения при объединении конструкторов в 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 ().

Итак, мой вопрос в том, как можно контролировать порядок вызова конструктора при объединении конструкторов в цепочку, а не используя синтаксис двоеточия, который может сначала вызвать только другой конструктор?

6
задан harpo 24 March 2011 в 23:20
поделиться