быстрый доступ к свойствам другого класса, лучшие практики - PullRequest
0 голосов
/ 28 ноября 2018

Мое приложение имеет класс CurrentContext, он обеспечивает доступ к свойствам, используемым во всем приложении (поэтому нет необходимости передавать объекты через параметры или методы конструктора).

Большинство этих свойств не меняют своего значения в течение одного сеанса.

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

Какой из приведенных ниже шаблонов является лучшей практикой?

В чем разница в использовании памяти или производительности?

Класс CurrentContext:

public class CurrentContext
{
   public Document Doc {get; set}
   public LogFile LogFile {get; set;}
   public bool AbortFlag {get; set;}
}

Класс, обращающийся к свойствам класса CurrentContext:

Вариант 1:

public class Example
{
   private Document Doc {get { return MyApp.CurrentContext.Doc; } }
   private LogFile LogFile {get { return MyApp.CurrentContext.LogFile; } }
   private bool AbortFlag {get { return MyApp.CurrentContext.AbortFlag; } }
}

Вариант 2:

public class Example
{
   private Document Doc {get; }
   private LogFile LogFile {get; }
   private bool AbortFlag {get; }

   public Example()
   {
       Doc = MyApp.CurrentContext.Doc;
       LogFile = MyApp.CurrentContext.LogFile;
       AbortFlag = MyApp.CurrentContext.AbortFlag;
   }
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Первая версия лучше, потому что возвращается текущее значение.Когда значение любой переменной MyApp.CurrentContext. * Изменяется, ваш Пример также будет меняться.

Эта версия немного медленнее, но на 99% процентов этот недостаток приемлем.

Но, пожалуйста, синтаксис члена тела выражения.Этот синтаксис предназначен для этого случая:

public class Example
{
   private Document Doc => MyApp.CurrentContext.Doc;
   private LogFile LogFile => MyApp.CurrentContext.LogFile;
   private bool AbortFlag => MyApp.CurrentContext.AbortFlag;
}

Этот код более понятен.

0 голосов
/ 28 ноября 2018

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

Первый всегда будет возвращать обновленное значение при доступе к свойствам, второй возвращает значения во время создания объекта.

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

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

...