Используя кэширование, руководствуйтесь здравым смыслом

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

Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов 

using system;

public class GraphicsGlobals {

 private static System.Drawing.Bitmap s_Player_Bitmap1;

 private static System.Drawing.Bitmap s_Player_Bitmap2;

 private static System.Drawing.Bitmap s_Player_Bitmap3;

 private static System.Drawing.Bitmap s_Player_Bitmap4;

 private static System.Collections.ArrayList s_colPlayerBitmaps;

 //------------------------------------------------------

 //Освободить все ресурсы

 //------------------------------------------------------

 public static void g_PlayerBitmapsCollection_CleanUp {

  //Если не загружено ни одно изображение, то и память освобождать не от чего

  if (s_colPlayerBitmaps == null) {

   return;

  }

  //Дать указание каждому из этих объектов освободить

  //любые удерживаемые ими неуправляемые ресурсы

  s_Player_Bitmap1.Dispose;

  s_Player_Bitmap2.Dispose;

  s_Player_Bitmap3.Dispose;

  s_Player_Bitmap4.Dispose;

  //Обнулить каждую из этих переменных, чтобы им не соответствовали

  //никакие объекты в памяти

  s_Player_Bitmap1 = null;

  s_Player_Bitmap2 = null;

  s_Player_Bitmap3 = null;

  s_Player_Bitmap4 = null;

  //Избавиться от массива

  s_colPlayerBitmaps = null;

 }

 //Функция: возвращает коллекцию изображений

 public static System.Collections.ArrayList g_PlayerBitmapsCollection {

  //---------------------------------------------------------------

  //Если изображения уже загружены, их достаточно только возвратить

  //---------------------------------------------------------------

  if (s_colPlayerBitmaps != null) {

   return s_colPlayerBitmaps;

  }

  //Загрузить изображения как ресурсы из исполняемого двоичного файла

  System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly;

  System.Reflection.AssemblyName thisAssemblyName = thisAssembly.GetName;

  string assemblyName = thisAssemblyName.Name;

Перейти на страницу:

Похожие книги