﻿# V4005\. Unity Engine\. The expensive operation is performed inside method or property\. Using such member in performance\-sensitive context can lead to decreased performance\.

Анализатор обнаружил, что в часто выполняемом коде производятся обращения к ресурсоёмким свойствам или методам\.

Согласно документации Unity, ряд методов и свойств из API Unity производят ресурсоёмкие операции при обращении\. Частое обращение к таким свойствам или методам может негативно сказаться на производительности приложения\.

Рассмотрим пример:

```cpp
public void Update()
{
  foreach (var cameraHandler in CameraHandlers)
  {
    cameraHandler(Camera.main);
  }

  ....
}
```

В методе 'Update' производится обработка камеры\. Данный метод вызывается на каждый кадр\. При обращении к свойству 'Camera\.main' осуществляется поиск в кэше, что создаёт нагрузку на процессор\. Таким образом, ресурсоёмкая операция будет выполняться на каждой итерации цикла\. 

Множественного обращения к свойству 'Camera\.main' можно избежать, если записать его значение в переменную:

```cpp
public void Update()
{
  var camera = Camera.main;

  foreach (var cameraHandler in CameraHandlers)
  {
    cameraHandler(camera);
  }

  ....
}
```

В данном случае обращение к 'Camera\.main' производится единожды\. Значение этого свойства присваивается переменной 'camera'\. Далее для обработки камеры используется эта переменная, а не свойство 'Camera\.main'\.

Рассмотрим ещё один пример:

```cpp
public void Update()
{
  ProcessCamera();

  ....
}

private void ProcessCamera()
{
  if (GetComponent<Camera>() == null)
    return;

  var cameraDepth = GetComponent<Camera>().depth;
  var cameraName = GetComponent<Camera>().name;
  var cameraEvent = GetComponent<Camera>().eventMask;
}
```

В методе 'ProcessCamera' записывается информация о камере\. Сама камера будет получена путём вызова 'GetComponent<Camera\>'\. Этот метод осуществляет поиск объекта, соответствующего типу 'Camera'\. Данная операция является ресурсоёмкой\. При каждом вызове 'ProcessCamera', метод 'GetComponent<Camera\>' выполнится четыре раза\. 'ProcessCamera' используется в методе 'Update', который является часто вызываемым\. 

Чтобы избавиться от множественного выполнения ресурсоёмкой операции, можно записать результат 'GetComponent<Camera\>' в переменную:

```cpp
private void ProcessCamera()
{
  var camera = GetComponent<Camera>();

  if (camera == null)
    return;

  var cameraDepth = camera.depth;
  var cameraName = camera.name;
  var cameraEvent = camera.eventMask;

  ....
}
```

Теперь вызов 'GetComponent<Camera\>' производится единожды\. Возвращаемое значение этого метода записывается в переменную 'camera'\. Далее информация о камере будет получена с помощью этой переменной, а не путём вызова 'GetComponent<Camera\>'\.