2009-05-16 8 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; 
} 

答えて

19

これは連鎖コンストラクタと呼ばれる - コンストラクタは(ベースコンストラクタのための兄弟コンストラクタ用thisbaseを使用して)この構文と同じタイプ内の他のコンストラクタを呼び出すことができます。ここで

は、それがどのように動作するかを示す簡単な例です:

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); 
    } 
} 

出力:

hello
world

+0

を使用する方法を見てみましょう。呼び出し元のコードでチェーンされたコンストラクタが表示されないため、最初はデザインの選択肢が貧弱に思えるでしょうか?間違っている可能性があります –

+0

@Nick Allen連鎖はクラスの内部(実装)の問題とみなされるため、呼び出し側は知ってはいけません。例えば、共有のプライベートコンストラクタに連鎖する2つのパブリックコンストラクタを持つことができます – krosenvold

1

これは、文字列を取るコンストラクタを作りますパラメータは新しいDirectoryInfoオブジェクト(パラメータとして文字列を使用しています)を渡して、DirectoryInfoパラメータを受け取るコンストラクタです。

私はしばしば、複雑なクラスに簡単なコンストラクタを提供するために、この方法を使用して、クラス自体がintitallizationコードを複製せずにデフォルト値でプロパティを初期化できるようにします。

2

これは、引数としてDirectoryInfoを取るクラス内の別のコンストラクタを呼び出します。

は、このクラスの呼び出し元がどちらかの前にこれを見たことがない

//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"); 
関連する問題