Выражения "=>" вызываются сразу? - PullRequest
1 голос
/ 14 октября 2019

У меня есть многочисленные списки типа List<SelectListItem> в моей модели, которые настроены с использованием выражения =>, например:

public List<SelectListItem> Users => Service.GetAll<User>().ToSelectList();

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

public List<SelectListItem> Users {get;set;}

public void LoadLists()
{
   this.Users = Service.GetAll<User>().ToSelectList();
}

Это вызвало проблему с моими представлениями, поскольку список выбора Users использовался в нескольких DropdownListFors, из-за чего любой обнуляемый DropdownListFor содержал самое последнее значение, которое использовало Users список выбора.

При использовании оригинального public List<SelectListItem> Users => Service.GetAll<User>().ToSelectList(); эта проблема не возникала, поскольку я предполагал, что он вызывался каждый раз, когда список выбора Users использовался в представлении?

Итак, ясоздал пустышку List<SelectListItem> вроде:

public List<SelectListItem> Test => Service.GetAll<User>().ToSelectList();

и не использовал его в представлении, а строка отладки никогда не была найдена. Итак, мой вопрос: => Выражения выполняются только тогда, когда они где-то используются?

Ответы [ 3 ]

3 голосов
/ 14 октября 2019

Этот код:

public List<SelectListItem> Users => Service.GetAll<User>().ToSelectList();

определяет свойство только с аксессором get. Это означает то же самое, что и это:

public List<SelectListItem> Users
{
    get { return Service.GetAll<User>().ToSelectList(); }
}

Запись => была введена в качестве альтернативы синтаксиса для выполнения того же действия с меньшим количеством строк кода.

И чтобы ответить на ваш вопрос:да, каждый раз, когда вызывается Users, выполняется тело свойства для обоих вариантов записи.

3 голосов
/ 14 октября 2019

=> может означать разные вещи в разных контекстах. В этом сценарии он просто обозначает способ описания свойства getter. Получатели свойства не вызываются «немедленно» - скорее, они вызываются только при обращении к свойству и каждый раз, когда к свойству обращаются.

«Немедленная» версия (при инициализации объекта)время) будет:

public List<SelectListItem> Users {get;} = Service.GetAll<User>().ToSelectList();

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

3 голосов
/ 14 октября 2019
public List<SelectListItem> Users => Service.GetAll<User>().ToSelectList();

является просто синтаксическим сахаром для:

public List<SelectListItem> Users { 
    get { 
        return Service.GetAll<User>().ToSelectList();
    }
}

Это называется свойством выражения в выражении .

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