2009-05-16 5 views
3
public class PhotoList : ObservableCollection<ImageFile> 
{ 


    public PhotoList() { } 

    **//this is the line that I dont recognise!!!!!!!!!!** 
    public PhotoList(string path) : this(new DirectoryInfo(path)) { } 

    public PhotoList(DirectoryInfo directory) 
    { 
     _directory = directory; 
     Update(); 
    } 

    public string Path 
    { 
     set 
     { 
      _directory = new DirectoryInfo(value); 
      Update(); 
     } 
     get { return _directory.FullName; } 
    } 

    public DirectoryInfo Directory 
    { 
     set 
     { 
      _directory = value; 
      Update(); 
     } 
     get { return _directory; } 
    } 
    private void Update() 
    { 
     foreach (FileInfo f in _directory.GetFiles("*.jpg")) 
     { 
      Add(new ImageFile(f.FullName)); 
     } 
    } 

    DirectoryInfo _directory; 
} 

Antwort

19

Dies wird Konstruktorverkettung genannt - Konstruktoren anderen Konstrukteuren mit dieser Syntax in der gleichen Art bezeichnen kann (this für Geschwister Konstruktoren und base für Basis Konstruktoren verwenden).

Hier ist ein einfaches Beispiel, das zeigt, wie es funktioniert:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo(); 
    } 
} 

class Foo 
{ 
    public Foo() : this("hello") 
    { 
     Console.WriteLine("world"); 
    } 

    public Foo(String s) 
    { 
     Console.WriteLine(s); 
    } 
} 

Ausgang:

hello
world

+0

dies auch noch nie gesehen. Zunächst scheint es sich um eine schlechte Design-Wahl zu handeln, da der aufrufende Code den verketteten Konstruktor nicht sieht. Kann falsch sein –

+0

@Nick Allen Die Verkettung wird als internes (Implementierungs-) Problem der Klasse betrachtet, daher sollte der Aufrufer nicht wissen. Sie könnten zum Beispiel zwei öffentliche Konstruktoren haben, die an einen gemeinsamen privaten Konstruktor verketten – krosenvold

1

Es macht den Konstruktor, der einen String Parameter ruft das auf Konstruktor, der einen DirectoryInfo-Parameter übernimmt und ein neues DirectoryInfo-Objekt (das wiederum die Zeichenfolge als Parameter verwendet) an ihn übergibt.

Ich verwende diesen Ansatz oft, um einfacheren Konstruktoren komplexe Klassen zur Verfügung zu stellen, wobei die Klasse selbst Eigenschaften mit Standardwerten initialisieren kann, ohne den Initialisierungscode duplizieren zu müssen.

2

Es ruft den anderen Konstruktor in der Klasse auf, die eine DirectoryInfo als Argument verwendet.

Mal sehen, wie der Aufrufer dieser Klasse

verwendet werden kann
//The empty ctor() 
PhotoList list = new PhotoList(); 

//The ctor that takes a DirectoryInfo 
PhotoList list2 = new PhotoList(new DirectoryInfo("directory")); 

//Would do the same as the code above since this constructor calls another constructor via the this() keyword 
PhotoList list3 = new PhotoList("directory");