Quaisquer coleções internas fracas (para objetos imutáveis)

Em algumas situações envolvendo objetos imutáveis, será possível a existência de muitos objetos distintos que são semanticamente idênticos. Um exemplo simples seria ler muitas linhas de texto de um arquivo em strings. Do ponto de vista do programa, o fato de duas linhas terem a mesma sequência de caracteres seria "coincidência", mas da perspectiva do programador pode-se esperar uma grande quantidade de duplicação. Se muitas instâncias de string forem idênticas, a alteração das referências a essas instâncias distintas em referências a uma única instância economizará memória e facilitará as comparações entre elas (se duas referências de string apontarem para a mesma string, não haverá necessidade de fazer uma caractere). por caractere para determinar se são idênticos).

Para alguns cenários, o recurso de internação de string fornecido pelo sistema pode ser útil. Tem, no entanto, algumas limitações severas:

Uma vez que uma cadeia é internada, essa cópia internada viverá para sempre, existindo ou não qualquer outra referência a elaO recurso de internação de seqüência de caracteres só funciona com seqüências de caracteres e não é utilizável com outros tipos imutáveis.

Se existisse um verdadeiroWeakDictionary<ImmutableClassType, ImmutableClassType> (para cada elemento, a chave e o valor seriam idênticos), o código poderia fazer algo como:

if (theDict.TryGetValue(myString, ref internedString))
  myString = internedString;
else
  theDict[myString] = myString;

Infelizmente, não tenho conhecimento de nenhum built-inWeakDictionary<keyType, valType> classe em .net. Além disso, seria um desperdício gerar uma referência fraca para a chave e o valor de cada item, quando ambas as referências sempre apontariam para a mesma coisa.

Eu li alguns sobreConditionalWeakTablee isso soa como uma classe interessante, mas eu não acho que seria útil aqui, já que o objetivo é ser capaz de pegar uma instância e encontrar outra instância independente que seja semanticamente equivalente.

Para situações em que instâncias de uma classe terão um tempo de vida bem definido, pode ser razoável usar umaDictionary para mesclar instâncias idênticas. Em muitos casos, no entanto, pode ser difícil saber quandoDictionary deve ser abandonado ou os itens nele eliminados. UMAWeakReferencecom base na coleta de internos evitaria tais problemas. Existe tal coisa, ou poderia ser prontamente implementada?

Termo aditivo Como svick notou, umDictionary<WeakReference, WeakReference> seria um pouco problemático, pois não haveria nenhuma maneira prática para definir umIEqualityComparer que teria um showWeakReference devolver oGetHashCode valor do seu alvo, e ter um morto continuar a retornar esse valor. Poder-se-ia definir uma estrutura que conteria um valor inteiro de alvo-hashcode (definido no construtor) e cujo próprioGetHashCode retornaria esse inteiro. Uma ligeira melhoria pode ser usar umConditionalWeakTable para ligar o alvo doWeakReference para um objeto finalizável que pode ser usado para enfileirar itens de tabela para exclusão.

Não sei qual é o equilíbrio adequado entre tentar limpar o dicionário ansiosamente, em vez de usar uma abordagem um pouco mais passiva (por exemplo, executar uma varredura ao adicionar um item se houver pelo menos um GC desde a última varredura e o número de itens adicionados desde a última varredura excede o número de itens que sobreviveram a ele). Varredura através de tudo no dicionário não vai ser livre, mas ConditionalWeakTable provavelmente não vai ser livre também.

PPS Outra noção que eu estava pensando, mas eu percebi que provavelmente não seria tão útil quanto uma abordagem de internação fraca, seria ter um tipo logicamente imutável para manter um valor "timestamp" mutável, e ter um método de comparação que aceita sua argumentos porref. Se duas instâncias diferentes forem iguais, seus valores de registro de data e hora serão examinados. Se ambos forem zero, eles receberiam números negativos consecutivos de um contador global (-1, -2, -3 etc.). O parâmetro que tinha (ou foi atribuído) o menor valor de registro de data e hora seria então substituído pelo outro.

Usando essa abordagem, se várias instâncias de objetos fossem comparadas repetidamente entre si, muitas das referências seriam substituídas por referências a instâncias "mais antigas". Dependendo dos padrões de uso, isso pode resultar na maioria das instâncias de objetos idênticos sendo mescladas sem o uso de qualquer tipo de dicionário interno. No entanto, aplicar essa abordagem a objetos aninhados exigiria que objetos "imutáveis" permitissem que as referências de objetos aninhados fossem mutadas para apontar para outros objetos aninhados supostamente idênticos. Isso deve ser bom se os objetos "supostamente idênticos" sempre forem, mas podem causar um mau comportamento bastante bizarro se não forem.

questionAnswers(1)

yourAnswerToTheQuestion