Слабые преимущества ссылки


может кто-нибудь объяснить основные преимущества различных типов ссылок в C#?

  • слабые ссылки
  • мягкие ссылки
  • Фантом ссылок
  • слабые ссылки.

У нас есть приложение, которое потребляет много памяти, и мы пытаемся определить, если это область, чтобы сосредоточиться.

3 72

3 ответа:

мягкие и фантомные ссылки приходят из Java, я считаю. Длинная слабая ссылка (pass true для конструктора WeakReference C#) может считаться похожей на PhantomReference Java. Если есть аналог SoftReference в C#, я не знаю, что это такое.

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

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

MSDN имеет хорошее объяснение слабые ссылки. Ключевая цитата находится внизу, где говорится:

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

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

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

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

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

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public BitmapWorkerTask(ImageView imageView) {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }
    // Method for getting bitmap is removed for code clearness

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

P. S. На пример в Java, но можно понять разработчиков C#.
Источник: http://developersdev.blogspot.ru/2014/01/weakreference-example.html