É string um tipo de valor ou um tipo de referência?

É string um tipo de valor ou um tipo de referência?

Eu simplesmente não consigo encontrar uma “boa” explicação para isso …

 Console.WriteLine(typeof(string).IsClass); // true 

É um tipo de referência.

Não pode ser um tipo de valor, pois os tipos de valor precisam de um tamanho conhecido para a pilha, etc. Como um tipo de referência, o tamanho da referência é conhecido antecipadamente, mesmo que o tamanho da string não seja.

Ele se comporta como você espera que um tipo de valor se comporte porque é imutável; ou seja, não muda * depois de criada. Mas há muitos outros tipos de referência imutáveis. Delegar instâncias, por exemplo.

* = exceto dentro do StringBuilder , mas você nunca o vê enquanto está fazendo isso …

String é um tipo de referência imutável.

Veja a postagem no blog Tipos imutáveis: entenda seus benefícios e use-os na imutabilidade.

String é um tipo de referência .

A “explicação” fundamental é baseada em “o que” é realmente armazenado no local da memory alocado quando você “declara” a variável para a coisa. Se o valor real da coisa estiver armazenado na localização da memory referida pelo nome da variável, então é um tipo de valor.

  int x; // memory allocated to hold Value of x, default value assigned of zero 

Se, otoh, o slot de memory alocado quando você “declara” a variável manterá apenas algum outro endereço de memory onde o valor real (ou valores) será armazenado, então é um tipo de referência.

  MyClass x; // Memory allocated to hold an address, // default address of null (0) assigned. // NO MEMORY ALLOCATED for x itself 

ou, se a declaração include boot,

  MyClass x = new MyClass(); // Now, Memory slot (call it Addr1) is allocated to hold address of x, // more memory (call it Addr2) is allocated to hold a new MyClass object. // New MyClass object created, stored in memory Addr2 (on the Heap) // Address of new object (Addr2) is stored in Addr1 

para uma string, a string é criada no heap e seu endereço fica no slot de memory alocado para a variável, portanto, é um tipo de referência.

String é um tipo de referência imutável que tem certas qualidades que lhe dão a aparência ocasional de ser um tipo de valor

O tipo de string representa uma seqüência de zero ou mais caracteres Unicode. string é um alias para String no .NET Framework.

Embora string seja um tipo de referência, os operadores de igualdade (== e! =) São definidos para comparar os valores de objects de string, não de referências. Isso torna o teste de igualdade de string mais intuitivo. Por exemplo:

 string a = "hello"; string b = "h"; // Append to contents of 'b' b += "ello"; Console.WriteLine(a == b); Console.WriteLine((object)a == (object)b); 

Isso exibe “True” e, em seguida, “False” porque o conteúdo das seqüências de caracteres é equivalente, mas aeb não se referem à mesma instância de seqüência de caracteres.

As strings são imutáveis ​​- o conteúdo de um object string não pode ser alterado depois que o object é criado, embora a syntax mostre que você pode fazer isso. Por exemplo, quando você escreve esse código, o compilador cria, na verdade, um novo object de string para manter a nova seqüência de caracteres, e esse novo object é atribuído a b. A string “h” é então elegível para garbage collection.

 string b = "h"; b += "ello"; 

Em muitos idiomas, há dois tipos gerais de coisas: aquelas em que um local de armazenamento de um tipo definido retém realmente um object desse tipo e aquelas em que um local de armazenamento de um tipo definido manterá uma referência a um object desse tipo que é armazenado em outro lugar. Existem também vários tipos de semântica que as coisas podem oferecer:

  1. Semântica de valor imutável: instâncias de um tipo particular têm alguma característica (“o valor”) que forma a base da identidade. Dois itens cujo valor é igual podem ser usados ​​de forma intercambiável, independentemente de onde eles estão armazenados. O valor será constante enquanto a instância existir. Uma variável desse tipo pode ter seu valor alterado, mas apenas armazenando uma instância diferente na variável.
  2. Semântica de referência imutável: geralmente semelhante à semântica do valor imutável, exceto pelo fato de que duas instâncias criadas em momentos diferentes se reportarão como instâncias diferentes.
  3. Semântica de valor mutável: instâncias de um tipo particular têm alguma característica ou coleção de características (“os valores”) que formam a base da identidade, mas essas características podem ser alteradas sem replace a instância inteira. Cada instância é armazenada precisamente em uma variável ou campo; copiar uma variável ou campo para outro copia todos os valores de uma primeira instância para a segunda, mas as instâncias permanecem separadas. Futuras alterações em uma instância não afetarão a outra.
  4. Semântica de referência mutável: cada instância é idêntica a si mesma, mas a nenhuma outra entidade, e as instâncias têm um ou mais valores que podem ser alterados dentro de instâncias existentes. Qualquer número de variables ​​ou campos pode conter uma referência a qualquer instância. Copiar uma ou variável de campo para outra simplesmente faz com que a segunda se refira à mesma instância que a primeira. Consequentemente, qualquer alteração na instância referida por uma das variables ​​afetará a instância referida pela outra (ou seja, a mesma instância).

Em algumas linguagens de programação, como C ++, é possível que os tipos de armazenamento direto e de referência indireta implementem qualquer um dos quatro tipos de semântica acima. Em .net e C #, os tipos armazenados diretamente com campos expostos sempre implementam o nº 3, os tipos de class com campos expostos sempre implementam o 4, outros tipos de valor podem implementar qualquer um dos itens acima e outros tipos de referência podem implementar # 1, # 2, ou # 4, mas não # 3, com uma abstração levemente mal vedada. Cordas implementam # 1.

Talvez o artigo Strings in .NET e C # possa ajudá-lo. De acordo com este artigo, string é um tipo de referência.