Necessita de interpretação da seção na especificação C #


11

Estou lendo a especificação c # . Eu poderia usar esclarecimentos em um segmento:

C # tem um sistema de tipo unificado. Todos os tipos de C #, incluindo tipos primitivos, como int e double, herdam de um único tipo de objeto raiz. Assim, todos os tipos compartilham um conjunto de operações comuns e valores de qualquer tipo podem ser armazenados, transportados e operados de maneira consistente. Além disso, o C # suporta tipos de referência e tipos de valor definidos pelo usuário, permitindo alocação dinâmica de objetos, bem como armazenamento em linha de estruturas leves.

O que significa "armazenamento em linha de estruturas leves" neste contexto?

Respostas:


11

A resposta de Svick é boa, mas pensei em acrescentar alguns pontos extras.

Primeiro, o parágrafo é falho. Os tipos de ponteiro não herdam do objeto. Os valores em tempo de compilação conhecidos por serem tipos de interface ou tipos de parâmetro de tipo, em tempo de execução, serão referências inválidas ou instâncias de boa-fé de algo que herda do objeto, mas sempre me foi estranho dizer que esses tipos " herdar "do objeto; herança é a propriedade que os membros do ancestral são membros do descendente, mas normalmente você não pensa em "ToString" como membro de IEnumerable. Você pensa nisso como um membro da coisa que implementa IEnumerable .

O parágrafo também é defeituoso porque este é o único local em que "tipo primitivo" aparece na especificação e aparece sem definição. Portanto, é desnecessário e confuso e deve ser removido.

Eu queria que este parágrafo fosse corrigido por um tempo. Da próxima vez que vir Mads, vou lembrá-lo.

Para responder à sua pergunta específica: svick está obviamente correto, mas é útil ver um exemplo específico. Quando voce diz:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

e você cria, digamos, uma matriz:

ColorfulInt[] x = new ColorFulInt[100];

Em seguida, o armazenamento dessas 100 polegadas e 100 cores entra no próprio array . Se ColorfulInt fosse uma classe, a matriz conteria 100 referências a ColorfulInt, cada uma das quais teria que ser alocada individualmente. Alocar individualmente esses cem elementos é muito menos eficiente no tempo e no espaço do que simplesmente alocar o armazenamento diretamente na própria matriz.


Então, é importante a abstração da memória desses objetos, onde quando você está pronto para manipulá-los, é mais fácil acessá-los se eles estiverem em um bloco contíguo de espaço endereçável, versus ponteiros para quem sabe onde? Está correto ou ainda estou faltando alguma coisa?
perfil completo de ChuckT

@ChuckT: Correto. Você não paga as despesas indiretas e também obtém uma boa localidade de cache.
precisa

12

Isso significa que os tipos de valor são armazenados diretamente onde você os define, o que os torna mais eficientes quando comparados aos tipos de referência.

O que exatamente isso significa? Se você tiver uma variável local de um tipo de valor, ela geralmente será armazenada diretamente na pilha (mas há muitas exceções). Se você tiver um campo de um tipo de valor, ele será armazenado diretamente na classe ou estrutura anexa.


1
Isso faz sentido. Obrigado por aprofundar isso para mim, svick!
ChuckT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.