C # только для чтения вычисляемых свойств, они должны быть методами? - PullRequest
41 голосов
/ 08 января 2010

У меня есть несколько объектов, которые вычислили поля на них, такие как TotalCost. Прямо сейчас у меня есть все они как свойства, но мне интересно, должны ли они быть методами. Есть ли для этого стандарт C #?

public class WorkOrder
{
    public int LaborHours { get; set; }
    public decimal LaborRate { get; set; }

    // Should this be LaborCost()?
    public decimal LaborCost
    {
        get
        {
            return LaborHours * LaborRate;
        }
    }
}

Ответы [ 11 ]

54 голосов
/ 08 января 2010

Можно использовать вычисляемые свойства, а не методы, если расчет не занимает заметного времени

См. Правила использования недвижимости

15 голосов
/ 08 января 2010

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

7 голосов
/ 08 января 2010

Я думаю, что все они должны быть свойствами. Пока это не меняет состояние объекта, я круче отношусь к нему как к свойству.

Кроме того, если я использую ваш класс для привязки данных (WPF и т. Д.), То я могу связываться напрямую с вашим свойством без необходимости изменять / расширять класс.

3 голосов
/ 08 января 2010

Если они а) легкие и б) не имеют побочных эффектов, я бы сделал их свойства.вызывая свойство (будь то в цикле или где-либо еще), возможно, это должен быть метод.

1 голос
/ 08 января 2010

Я бы оставил их как свойства. Но нет «стандартной» причины делать то или иное дело. Если ты один, делай все, что тебе больше нравится. Если вы в команде, следуйте правилам, которым следуют остальные члены вашей команды.

0 голосов
/ 29 августа 2011

Иногда вам нужно учитывать и то, что вы моделируете ... В некоторых доменах расчетные значения часто или, как ожидается, будут атрибутом модели - свойством. Если это так, то запишите его как свойство, даже если вычисление совсем не тривиально или немного дороже в вычислении. Просто документируйте его в своем API или реализуйте некоторый механизм кэширования, чтобы минимизировать повторные вычисления для этого свойства.

0 голосов
/ 08 января 2010

MSDN дает информацию об этом здесь

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

Какой из них вы думаете? Действие рассчитать / getLaborCost или данные?

WorkOrder workOrder = new WorkOrder();
workOrder.LaborHours = 8;
workOrder.LaborRate = 20;

decimal cost = workOrder.LaborCost; // This is OK here

но если вы собираетесь сделать это для того же объекта также:

worOrder.LaborHours = 18;
decimal newCost = workOrder.LaborCost 

Теперь это не может быть собственностью. Было бы намного лучше быть методом.

0 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

Если свойство вычислять особенно дорого, я могу изменить его на метод GetWhwhat (). Это служит подсказкой для любого, кто использует мой класс, что это значение требует некоторой значительной работы, и вызывающий объект должен кэшировать значение, а не вызывать метод несколько раз.

Тривиальные вычисления идеально подходят для свойств.

0 голосов
/ 08 января 2010

Зависит от того, что если ваши "свойства" становятся мамонтами и требуют целого ряда бизнес-логики, они не должны быть свойствами, должен быть метод. Пример, который вы разместили, выглядит вполне нормально. Нет стандартного способа сделать это, следуйте своему инстинкту; если он выглядит так, как будто ему нужно многое, вам, вероятно, нужен метод.

...