Existe alguma diferença funcional entre tipos de valores imutáveis e tipos de referência imutáveis?

5

Tipos de valor são tipos que não possuem identidade. Quando uma variável é modificada, outras instâncias não são.

Usando a sintaxe JavaScript como exemplo, veja como funciona um tipo de valor.

var foo = { a: 42 };
var bar = foo;
bar.a = 0;
// foo.a is still 42

Tipos de referência são tipos que possuem uma identidade. Quando uma variável é modificada, outras instâncias são também.

Veja como funciona um tipo de referência.

var foo = { a: 42 };
var bar = foo;
bar.a = 0;
// foo.a is now 0

Observe como o exemplo usa objetos mutáveis para mostrar a diferença. Se os objetos fossem imutáveis, você não poderia fazer isso, então esse tipo de teste para tipos de valor / referência não funciona.

Existe alguma diferença funcional entre tipos de valores imutáveis e tipos de referência imutáveis? Existe algum algoritmo que possa dizer a diferença entre um tipo de referência e um tipo de valor se eles forem imutáveis? A reflexão é trapaça.

Estou me perguntando isso principalmente por curiosidade.

    
por Kendall Frey 06.06.2012 / 21:31
fonte

4 respostas

2

Você está definindo tipos de valores e referências de maneira agnóstica, mas fazendo isso apenas pelo exemplo em termos de alteração de membros de dados. Logicamente, tornar os tipos imutáveis faz com que você perca a única diferença garantida pela sua definição (e a resposta pode ser "não").

No entanto, quando começamos a olhar para linguagens de programação específicas, então sim: há mais diferenças.

Considere o seguinte exemplo em C #.

void increment()
{
    lock (synchro)
    {
        total++;
    }
}

private int total = 0;
private SomeType synchro;

Se SomeType for um tipo de referência, esse contador será thread-safe. Se SomeType for um tipo de valor, então, devido ao boxe, cada thread está bloqueando uma cópia de synchro e os incrementos podem ser perdidos na simultaneidade.

Naturalmente, não existem tipos realmente imutáveis no .NET no sentido mais abstrato, já que os monitores envolvidos são implementados usando campos ocultos (semelhante à palavra-chave C ++ mutable que pode declarar membros mutáveis em tipos que de outra forma seriam imutáveis). Mas no Stack Overflow, todos entenderão sua pergunta para se referir a qualquer coisa que sua plataforma chame de "imutável".

    
por 06.06.2012 / 21:44
fonte
2

Sim, a igualdade ainda é diferente:

a: value type = 4;
b: value type = 4;

c: reference type = 4;
d: reference type = 4;

a == b; // true;
c == d; // false;

O C # trai coisas como strings consolando referências equivalentes, mas isso não é estritamente necessário para tipos de referência imutáveis.

    
por 06.06.2012 / 22:27
fonte
0

Valor versus tipo de referência não é um termo independente de idioma. Uma linguagem como C ++ e C não possui uma distinção - é uma imposição arbitrária de algumas linguagens. No entanto, vou tentar rolar com isso de qualquer maneira.

Um exemplo simples é sizeof(T) . Todos os tipos de referência têm o tamanho de um ponteiro (possivelmente mais o tamanho de outro ponteiro, dependendo do seu sistema de gerenciamento de memória). Tipos de valor, no entanto, não. Além disso, você pode medir as características de desempenho para determinar se está lidando com um valor ou um tipo de referência. Além disso, não é particularmente seguro fazer referência a tipos de valor em alguns contextos.

Tipos de referência podem fazer algumas coisas que tipos de valor imutáveis não podem - por exemplo, referências a eles podem se recuperar para outra instância.

class X {
    const int imm;
    X() : imm(0) {}
};
class Y {
    const int* imm;
    Y() : imm(new int(0));
};
X x;
Y y;
y.imm = new int(5); // Whoops! The reference itself is not immutable.

Fundamentalmente, deve sempre ser conhecido se um tipo é um valor ou uma referência, senão você não pode gerar o código correto para acessá-lo.

    
por 06.06.2012 / 22:29
fonte
-1

Resumidamente: Um Tipo de Valor contém os dados dentro de sua própria alocação de memória e um Tipo de Referência contém um ponteiro para outro local da memória que contém os dados reais. As variáveis do Tipo de Referência são armazenadas no heap enquanto as variáveis do Tipo de Valor são armazenadas na pilha.

Mais: diferença entre um tipo de valor e um tipo de referência

    
por 28.08.2013 / 09:20
fonte