O string
tipo é imutável.
Podemos usar a const
palavra-chave com strings
linguagem de alto nível, como .NET. Meu entendimento de 'const' significa constante (permanece o mesmo, não podemos alterar o valor).
São strings
nem sempre constant
(IMO o termo constant
não deve ser aplicável no mesmo contexto se o tipo tem de ser recriado cada vez que isso significa para o tempo valores vida, era constante)?
Em linguagens de alto nível, especificamente .NET (embora eu também estivesse interessado em Java), isso ocorre devido ao gerenciamento / rastreamento geral de objetos da memória ou há outro motivo?
strings
immutability
Dave
fonte
fonte
final
modificador em uma variável de string impede que a variável seja alterada para apontar para uma string diferente.Respostas:
Você está confundindo duas coisas diferentes:
Imutável significa que o conteúdo da memória do objeto não pode ser modificado. Quando você modifica um objeto imutável (por exemplo, a
string
), o conteúdo da memória desse objeto não é modificado. Em vez de:Constante significa que a variável não pode ser modificada em tempo de compilação. Se um
string
ouinteger
o conteúdo da variável (ou para o que ela aponta) não pode ser alterado ou atribuído em tempo de compilação.fonte
const
você não pode modificá-lo. Você pode defini-lo para um valor inicial, mas não pode atribuir um valor diferente a ele em nenhum outro lugar, portanto, não pode modificá-lo.Como dizem os comentários, você está confundindo "constante" com "imutável", quando eles realmente significam duas coisas muito diferentes.
Uma constante é uma variável que não pode ser alterada. Dependendo do idioma e do compilador, é inteiramente possível que o código compilado substitua simplesmente todo uso dessa variável pelo valor atribuído a ela; nesse caso, nunca seria alocado um ponto na memória. Mesmo se o compilador não otimizar dessa maneira, ele ainda está alocado um ponto na memória no lançamento (desde que
const
implicastatic
) e permanece lá até a saída.Um imutável é um valor na memória que não pode ser alterado (até que a memória seja recuperada). É atribuído um lugar na memória, conforme necessário, e pode (teoricamente) ser armazenado em várias variáveis. Atribuir a uma variável que está apontando para um valor imutável simplesmente cria um novo imutável e altera a variável para apontar para ela. O valor antigo permanece na memória até a coleta de lixo, o que pode ocorrer mesmo enquanto o programa está sendo executado.
fonte
Strings não podem mudar. Ponteiros para seqüências de caracteres podem mudar. O código a seguir é válido:
O objeto "Texto" original ainda está lá, inalterado e imutável, exceto que nada está apontando para ele. Um mutável
String
permitiria que você o fizessetext.substring(1)
sem precisar atribuí-lo de volta àtext
variável e alteraria o objeto original. Se você deseja que a variáveltext
não seja alterada, é quando você a fazconst
. Existem casos de uso válidos para ambos.Como observação lateral, este é um bom exemplo de conceito mais fácil de entender em C ++, porque objetos e ponteiros para objetos têm tipos diferentes.
fonte
Acredito que você esteja confundindo variáveis e objetos.
Uma variável é simplesmente uma referência a um objeto .
Enquanto seu programa está sendo executado, uma variável pode se referir a vários objetos . Atribuir algo à variável não altera o objeto. Se não houver variáveis que façam referência a um objeto, ele se tornará lixo.
A
String
é considerado imutável (em Java, e eu também esperaria em .Net) porque não há como alterar o objeto .Uma constante é simplesmente uma variável que não pode ser alterada durante a vida útil do programa. Você define uma constante com o
final
modificador em Java e oconst
modificador em .Net.No entanto, se sua variável "constante" aponta para um objeto mutável, a "constância" da variável não afeta a mutabilidade do objeto (na verdade, não posso dizer isso com certeza no .Net, porque estou assumindo que herda algumas das regras misteriosas do C ++).
fonte
Uma demonstração simples do que é
const
adequado. Isso é aplicável ao C # e a idiomas semelhantes.fonte
const
se comporta, o comportamento não é exclusivoconst
. Em Java, afinal
palavra - chave se comporta de maneira semelhante e em C # areadonly
palavra - chave faz o mesmo. O único aspecto de aconst
é que ele é conhecido em tempo de compilação.