C # - получить количество ссылок на объект

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

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

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

13
задан 6 November 2009 в 09:20
поделиться

5 ответов

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

class Manager {
    Dictionary<string, WeakReference> refs =
        new Dictionary<string, WeakReference>();
    public object this[string key] {
        get {
            WeakReference wr;
            if (refs.TryGetValue(key, out wr)) {
                if(wr.IsAlive) return wr.Target;
                refs.Remove(key);
            }
            return null;
        }
        set {
            refs[key] = new WeakReference(value);
        }
    }
}
static void Main() {
    Manager mgr = new Manager();
    var obj = new byte[1024];
    mgr["abc"] = obj;

    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
    Console.WriteLine(mgr["abc"] != null); // true (still ref'd by "obj")

    obj = null;
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
    Console.WriteLine(mgr["abc"] != null); // false (no remaining refs)
}
12
ответ дан 1 December 2019 в 17:51
поделиться

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

Более прямой ответ: нет, нет способа получить ссылки на объект.

Вы можете изучить класс WeakReference или использовать систему кэширования.

2
ответ дан 1 December 2019 в 17:51
поделиться

Пара вещей. Во-первых, объекты не учитываются; В схемах подсчета ссылок возникает проблема циклических ссылок, когда два объекта ссылаются друг на друга, но в противном случае недоступны и, таким образом, протекают. .NET использует подход mark-and-sweep, который не использует счетчики ссылок.

Во-вторых, хотя предложение использовать слабую ссылку не ужасно, это также не хитрый данк. Вы создаете кеш из соображений производительности. (Я предполагаю, что ваше тщательное, эмпирическое и реалистичное исследование характеристик производительности вашего приложения убедительно продемонстрировало, что для достижения приемлемой производительности необходима стратегия кэширования; если это не так, то вы принимаете эти решения преждевременно.) кеш должен иметь ПОЛИТИКУ, когда он освобождает свои ресурсы, в противном случае это утечка памяти.

Как узнать, что политика GC и ваша политика эквивалентны? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для высвобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

эмпирическое, реалистичное исследование характеристик производительности вашего приложения убедительно продемонстрировало, что стратегия кэширования необходима для достижения приемлемой производительности; Если это не так, то вы принимаете эти решения преждевременно.) Каждый кеш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, в противном случае это утечка памяти.

Откуда вы знаете, что политика GC и ваша политика являются эквивалентные политики? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для высвобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

эмпирическое, реалистичное исследование характеристик производительности вашего приложения убедительно продемонстрировало, что стратегия кэширования необходима для достижения приемлемой производительности; Если это не так, то вы принимаете эти решения преждевременно.) Каждый кеш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, иначе это утечка памяти.

Как вы знаете, что политика GC и ваша политика являются эквивалентные политики? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для высвобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

реалистичное исследование характеристик производительности вашего приложения убедительно продемонстрировало, что стратегия кэширования необходима для достижения приемлемой производительности; Если это не так, то вы принимаете эти решения преждевременно.) Каждый кеш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, в противном случае это утечка памяти.

Откуда вы знаете, что политика GC и ваша политика являются эквивалентные политики? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для освобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы задумали. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

реалистичное исследование характеристик производительности вашего приложения убедительно продемонстрировало, что стратегия кэширования необходима для достижения приемлемой производительности; Если это не так, то вы принимаете эти решения преждевременно.) Каждый кеш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, иначе это утечка памяти.

Как вы знаете, что политика GC и ваша политика являются эквивалентные политики? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для высвобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

) Каждый кэш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, в противном случае это утечка памяти.

Откуда вы знаете, что политика GC и ваша политика эквивалентны? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для освобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы задумали. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

) Каждый кэш должен иметь ПОЛИТИКУ относительно того, когда он освобождает свои ресурсы, в противном случае это утечка памяти.

Откуда вы знаете, что политика GC и ваша политика эквивалентны? ГХ был разработан без учета ваших конкретных требований к производительности. То есть он был разработан для освобождения ресурсов, которые на самом деле являются мусором, а не для достижения какой-либо конкретной цели производительности, которую вы задумали. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

не для достижения какой-либо конкретной цели производительности, которую вы наметили. Передавая решение GC, вы отказываетесь от возможности настраивать политику кеширования в соответствии с вашими требованиями к производительности.

31
ответ дан 1 December 2019 в 17:51
поделиться

Убедитесь, что диспетчер ресурсов использует WeakReference для ваших ресурсов. Таким образом, когда никто другой не ссылается на ресурсы, они будут иметь право на сборку мусора.

1
ответ дан 1 December 2019 в 17:51
поделиться

Как уже говорили другие пользователи, то, что вы пытаетесь достичь, уже сделано GC и может быть точно настроено с помощью WeakReference .

Это подразумевает что в управляемых средах, таких как .NET, java и т. д., это не проблема.

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

0
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

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