Ресурсы, которые должны быть вручную очищены в C#?

Создайте функцию «калькулятор», которая делает то, что вы хотите (суммирует свойство маркера, указывающее «количество людей».

Документация для функции «калькулятор». Возвращает объект со свойствами :

  • text (текст появится в кластере)
  • index (индекс в массив стилей для доступа к стилю для этого кластера.
/**
 *  The function for calculating the cluster icon image.
 *
 *  @param {Array.<google.maps.Marker>} markers The markers in the clusterer.
 *  @param {number} numStyles The number of styles available.
 *  @return {Object} A object properties: 'text' (string) and 'index' (number).
 *  @private
 */
MarkerClusterer.prototype.calculator_ = function(markers, numStyles) {
  var index = 0;
  var count = markers.length;
  var dv = count;
  while (dv !== 0) {
    dv = parseInt(dv / 10, 10);
    index++;
  }

  index = Math.min(index, numStyles);
  return {
    text: count,
    index: index
  };
};

Если вы добавите свойство к своим данным, «число», вы можете сделать что-то вроде этого:

фрагмент кода:

window.onload = function() {
  // cluster marker
  var clusterMarker = [];

  var map = new google.maps.Map(document.getElementById('map'), {
    center: new google.maps.LatLng(50, 3),
    zoom: 6,
    mapTypeId: 'terrain'
  });


  // Some sample data
  var sampleData = [{
    lat: 50,
    lng: 3,
    number: 20

  }, {
    lat: 50,
    lng: 3.02,
    number: 1
  }];


  for (var i = 0; i < sampleData.length; i++) {

    var point = sampleData[i];
    var location = new google.maps.LatLng(point.lat, point.lng);

    // create marker at location
    var marker = new google.maps.Marker({
      position: location,
      map: map,
      number: sampleData[i].number,
      title: "" + sampleData[i].number
    });

    // needed to cluster marker
    clusterMarker.push(marker);
  }

  var clusterer = new MarkerClusterer(map, clusterMarker, {
    imagePath: 'https://raw.githubusercontent.com/googlemaps/js-marker-clusterer/gh-pages/images/m',
    maxZoom: 15
  });

  clusterer.setCalculator(function(markers, numStyles) {
    var index = 0;
    var count = 0;
    for (var i = 0; i < markers.length; i++) {
      if (markers[i].number) {
        count += markers[i].number;
      } else {
        count++;
      }
    }
    var dv = markers.length;
    while (dv !== 0) {
      dv = parseInt(dv / 10, 10);
      index++;
    }

    index = Math.min(index, numStyles);
    return {
      text: count,
      index: index
    };
  });
}
html,
body,
#map {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/src/markerclusterer.js"></script>

<div id="map"></div>

11
задан Edgar Rokjān 20 August 2017 в 16:04
поделиться

13 ответов

Технически что-либо, что наследовалось IDisposable, должно быть заранее расположено. Можно использовать оператор 'использования' для создания вещей легче.

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

Иногда Вы будете видеть непоследовательное использование производных объектов IDisposable в примере кода документации, а также коде, который сгенерирован инструментами (т.е. Visual Studio).

То, что хорошо о IDisposable, - то, что он дает Вам способность заранее выпустить базовый неуправляемый ресурс. Иногда Вы действительно хотите сделать, это - думает сетевые соединения и ресурсы файла, например.

1
ответ дан 3 December 2019 в 06:23
поделиться

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

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

-3
ответ дан 3 December 2019 в 06:23
поделиться

Одно место, чтобы быть осторожным является Объектами, которые выглядят маленькими к GC, но не являются... В API SharePoint, например, объект SPWeb имеет маленькое место, что касается GC и так будет иметь низкий приоритет для набора, но это действительно захватило набор памяти (в "куче", я полагаю), что GC не знает о. Вы столкнетесь с некоторыми забавными проблемами памяти, если Вы будете foreaching целый набор их, например, всегда не забывайте использовать использование или располагать!

0
ответ дан 3 December 2019 в 06:23
поделиться

Сначала после завершения программы, можно предположить, что память, используемая процессом, будет устранена с самим процессом.

В то время как использование располагает или деструктор in.net, нужно понять, что время того, когда расположить функция вызвана GC, недетерминировано. Это, почему рекомендуется использовать использование или вызов расположения явно.

При использовании ресурсов, таких как файлы, должны быть освобождены объекты памяти, такие как semaphors и ресурсы, которые живут за пределами управляемого мира .NET.

SolidBrush, например, необходимо расположить, потому что это - объект GDI и живущий за пределами мира .NET.

0
ответ дан 3 December 2019 в 06:23
поделиться

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

Одно из большого преимущества C# по сравнению с C/C++ - то, что Вы не должны заботиться об освобождении выделенных объектов (большую часть времени, по крайней мере); gc делает это, когда время выполнения решает (различные стратегии, когда/как сделать это).

Много ресурсов не заботятся о gc: файл, связанные с потоком ресурсы (блокировки), сетевые соединения, и т.д...

0
ответ дан 3 December 2019 в 06:23
поделиться

Ну, пока Вы используете управляемую версию ресурсов и не называете окна API собой, необходимо быть в порядке. Только беспокойство о необходимости удалить/уничтожить ресурс, когда то, что Вы получаете, является IntPtr, как "дескрипторы окон" (и много другие вещи) известно в.NET и не объекте.

Между прочим, ресурс (как любой другой объект.NET) будет отмечен для набора, как только Вы оставляете текущий контекст, поэтому при создании Кисти в методе это будет отмечено при выходе из него.

0
ответ дан 3 December 2019 в 06:23
поделиться

Если это справилось (т.е. часть платформы), Вы не должны волноваться об этом. Если это реализует IDisposable, просто переносят его в a using блок.

Если Вы хотите использовать неуправляемые ресурсы затем, необходимо читать на финализаторах и реализующий IDisposable сами.

Под этим вопросом существует намного больше детали

0
ответ дан 3 December 2019 в 06:23
поделиться

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

1
ответ дан 3 December 2019 в 06:23
поделиться

Если Вы не расположите что-то, то это будет очищено, когда сборщик "мусора" заметит, что больше нет ссылок на него в Вашем коде, который может быть через какое-то время. Для чего-то как этот это действительно не имеет значения, но для открытого файла это, вероятно, делает.

В целом, если что-то имеет Расположить метод, необходимо назвать его, когда Вы закончили с ним, или, если Вы можете, обернуть его в a using оператор:

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black))
{
    // use myBrush
}
7
ответ дан 3 December 2019 в 06:23
поделиться
  • Дескрипторы к внутренним структурам данных окон.
  • Соединения с базой данных.
  • Дескрипторы файлов.
  • Сетевые соединения.
  • Ссылки COM/OLE.

Список продолжается.

Важно звонить Dispose или даже еще лучше, используйте using шаблон.

using (SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black))
{
    // use myBrush
}

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

В случае System.Drawing.Brush, Windows сохранит внутренние структуры окон для кисти загруженными в памяти, пока все программы не выпустят свой дескриптор.

7
ответ дан 3 December 2019 в 06:23
поделиться

Обычно что-либо, что реализует IDisposable, должно заставить Вас приостанавливать и исследовать ресурс, который Вы используете.

GC только происходит, когда существует давление памяти, таким образом, Вы не можете предсказать когда. Хотя разгружение AppDomain, конечно, инициирует его.

2
ответ дан 3 December 2019 в 06:23
поделиться

Последствия не расположения Вашего IDisposables могут варьироваться от незначительного хита производительности до катастрофического отказа Вашего приложения.

Объект Кисти в Вашем примере будет очищен GC, когда будет похоже на него. Но Ваша программа не будет обладать преимуществом того бита дополнительной памяти, которую Вы получили бы путем чистки его ранее. Если Вы используете много объектов Кисти, что это могло бы стать значительным. GC также более эффективен при чистке объектов, если они не были вокруг очень длинного, потому что это - сборщик "мусора" поколений.

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

Любое использование

using (new DisposableThing...
{
    ...
}

Или, если необходимо держаться за ссылку на IDisposable в объекте в течение его времени жизни, реализовать IDisposable на объекте и звонить, IDisposable's Располагают метод.

class MyClass : IDisposable
{
    private IDisposable disposableThing;

    public void DoStuffThatRequiresHavingAReferenceToDisposableThing() { ... }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    //etc... (see IDisposable on msdn)

}

3
ответ дан 3 December 2019 в 06:23
поделиться

Прием, который я использую, когда я не могу помнить, является ли данный объект доступным ресурсом, должен ввести ".Dispose" (самое большее!) после объявления, чтобы заставить Intellisense проверять на меня:

MemoryStream ms = new MemoryStream().Dispose

Затем удалите.Dispose и используйте использование () директива:

using(MemoryStream ms = new MemoryStream())
{
  ...
}
1
ответ дан 3 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: