Что делает конструктор с пустым телом и синтаксисом, похожим на наследование? - PullRequest
3 голосов
/ 16 мая 2009
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;
}

Ответы [ 3 ]

19 голосов
/ 16 мая 2009

Это называется цепочкой конструктора - конструкторы могут вызывать другие конструкторы в пределах того же типа с этим синтаксисом (используя this для конструкторов одного уровня и base для базовых конструкторов).

Вот простой пример, который показывает, как это работает:

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

2 голосов
/ 16 мая 2009

Вызывает другой конструктор в классе, который принимает 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");
1 голос
/ 16 мая 2009

Это заставляет конструктор, который принимает строковый параметр, вызывать конструктор, который принимает параметр DirectoryInfo, передавая ему новый объект DirectoryInfo (который, в свою очередь, использует строку в качестве параметра).

Я часто использую этот подход, чтобы предоставить более простые конструкторы для сложных классов, позволяя самому классу инициализировать свойства со значениями по умолчанию без необходимости дублировать код инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...