2009-03-20 8 views

Antwort

3

können Sie verwenden, um eine statische Methode, dies zu tun.

class Foo 
{ 
    pubic Foo(string name) 
    {...} 

    public Foo(Bar bar): base(GetName(bar)) 
    {...} 

    static string GetName(Bar bar) { 
     if(bar==null) { 
      // or whatever you want... 
      throw new ArgumentNullException("bar"); 
     } 
     return bar.Name; 
    } 
} 
+0

möchten Dies ist horrend und falsch. Das Auslösen von Ausnahmen während der Konstruktion bedeutet, dass das Objekt nicht erfolgreich erstellt wurde, was bedeutet, dass Destruktoren nicht aufgerufen werden. Wenn Sie bereits Ressourcen zugewiesen haben, die ordnungsgemäß entsorgt werden müssen, haben Sie die Klasse jetzt auf subtile Weise schwer zu debuggen. Ausnahmen beim Bau: Sag einfach nein. Foo sollte stattdessen nicht sperren, wenn der Name null ist. Oder Sie können den Namenseinstellungscode in eine statische Datei extrahieren, die beide Konstruktoren aufrufen können. –

+1

@Dirk meh, etwa 99,99% C# -Klassen * haben keine * a Finalizerthread –

+1

wahr, es ist nur 0,01% horrend ist. –

1
public Foo(Bar bar): base(bar == null ? "" : bar.name) 
{...} 
2
class Foo 
{ 
    public Foo(Bar bar): base(bar == null ? default(string) : bar.name) 
    { 
     // ... 
    } 
} 

lassen alternativ die Bar-Klasse Griff mit einem Objekt der Bar-Klasse und ein Argument werfen, wenn Sie

+0

Diese Methode scheint gut, aber ich wählte die statische Version als die Antwort aus einem einfachen Grund, Lesbarkeit. Vor allem, weil ich brauche 4 Eigenschaften der Bar Klasse zuzugreifen, die den Konstruktor machen würden sehr unleserlich –

+0

:) das ist ok ... ich würde eher dazu neigen, den Ctor in der Bar-Klasse, die Bar-Objekte behandelt ... einen schönen Tag ! –