Правильное использование свойств и автоматически реализованных свойств? - PullRequest
0 голосов
/ 04 сентября 2018

Я только в главе 5 "Essential C #" и не уверен, правильно ли я понимаю разницу. Я попытался создать приведенную ниже модель для тестирования одного экземпляра всего в главе свойств - и это работает - но является ли пример допустимым использованием двух способов реализации свойств или есть лучшие способы?

using MarkdownSharp; // StackOverflow's md processor 

public class Article
{
    public string Headline { get; set; }
    public string Content
    {
        get
        {
            return _content;
        }
        set
        {
            var md = new Markdown();
            var html = md.Transform(value);
            _content = html;
        }       
    }
    private string _content;
    public DateTime Published { get; set; } = DateTime.Now;
}

1 Ответ

0 голосов
/ 04 сентября 2018

Этот вопрос может лучше подойдет для codereview.stackexchange, хотя, возможно, это слишком маленький фрагмент кода и неясный вопрос для этого.

Лично я уклоняюсь от магических свойств, которые действуют удивительным образом. Это имеет тенденцию делать для API, которые могут быть трудны в использовании, потому что они удивительны, даже если они как-то «умны» под капотом. У вас есть свойство, в котором вы устанавливаете значение, отличное от того, которое вы получаете. Единственное, что может сломать это оператор +=, который неожиданно сработает очень странным образом с вашим свойством Content.

Я бы, наверное, пошел с чем-то вроде

public class Article
{
    private string content;
    private string renderedContent;

    public string Headline { get; set; }
    public string Content
    {
        get { return content; }
        set
        {
            content = value;
            renderedContent = null; // reset cached rendered content
        }
    }

    public string RenderedContent
    {
        get
        {
            if (renderedContent == null)
            {
                renderedContent = new Markdown().Transform(content);
            }
            return renderedContent;
        }
    }

    public DateTime Published { get; set; } = DateTime.Now;
}

Что касается того, использовать ли полевые свойства, или авто-свойства, или вычисленные свойства ... вам решать, что делать с этим свойством. Авто-свойства хороши для простого хранения и извлечения значения, например, Published или Headline здесь. Вам нужно явное поле поддержки, как только вы сделаете что-то большее, чем просто чтение или запись в геттер и сеттер, как показано здесь в Content. RenderedContent может быть просто вычисляемым свойством, но я решил кэшировать значение после первоначального преобразования, потому что вы делаете то же самое. Этот паттерн здесь не конвертирует уценку, пока он не понадобится.

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