Используют ли автоматически реализуемые свойства приватные конструкторы для их инициализации - PullRequest
0 голосов
/ 13 мая 2018

Я подробно читал C # Джона Скита и натолкнулся на объяснение автоматически реализованных свойств в C # 3 .

Код для этого был:

class Product
{
    public string Name { get; private set; }
    public decimal Price { get; private set; }

    public Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }

    Product() {}

    public static List<Product> GetSampleProducts()
    {
        return new List<Product>
               {
                   new Product { Name="West Side Story", Price = 9.99m },
                   new Product { Name="Assassins", Price=14.99m },
                   new Product { Name="Frogs", Price=13.99m },
                   new Product { Name="Sweeney Todd", Price=10.99m}
               };
    }
}

И текст, объясняющий это,

Теперь у свойств нет кода (или видимых переменных)!) связан с ними, и вы создаете жестко закодированный список совсем по-другому.Не имея доступа к именным и ценовым переменным, вы вынуждены использовать свойства повсюду в классе, что повышает согласованность. Теперь у вас есть собственный конструктор без параметров для новой инициализации на основе свойств.(Этот конструктор вызывается для каждого элемента перед установкой свойств.) В этом примере вы могли бы полностью удалить публичный конструктор, но тогда никакой внешний код не мог бы создать другие экземпляры продукта.

Я не могу обернуть голову вокруг части, выделенной жирным шрифтом.Он говорит, что закрытый конструктор предназначен для автоматически реализуемых свойств и вызывается каждый раз перед его установкой.Тем не менее, даже когда я вставил консоль, она не была вызвана.И даже с удаленными частными конструкторами код работал нормально.

Я знаю роль частных конструкторов в C #, но я не могу понять, как это связано с автоматически реализуемыми свойствами, если это из текста выше.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Этот фрагмент кода использует синтаксис инициализатора объекта в GetSampleProducts статический метод. Инициализаторы объектов могут использоваться только для типов с конструктором без параметров, потому что это все о синтаксическом сахаре. Это

var p = new Product { Name="West Side Story", Price = 9.99m }

действительно переводится на это под капотом

var p = new Product();
p.Name = "West Side Story";
p.Price = 9.99m;

Это означает, что для вызова var p = new Product(); требуется конструктор без параметров. И он будет фактически вызываться для каждого элемента до того, как свойства будут установлены.

Конструктор является закрытым, но поскольку GetSampleProducts находится внутри Product типа, он может получить доступ к Product закрытым членам. Если вы попробуете тот же синтаксис за пределами этого класса, он потерпит неудачу.

Итак, это

Теперь у вас есть собственный конструктор без параметров для новой инициализации на основе свойств.

Фактически означает, что конструктор здесь не используется для автоматически реализуемых свойств, он необходим для инициализации на основе свойств (этот термин означает инициализатор объекта), и если вы удалите его, вы получите ошибки компиляции .

0 голосов
/ 13 мая 2018

Вместо использования приватного поля в классе и затем в свойстве get вы возвращаете приватное поле как:

private int age;

public int Age
{get {return age;}
 set {age = value}
}

При автоматической имплантации закрытое int создается за кулисами.

Синтаксис для автоматически реализованного свойства:

public int age {get; set;}
...