Por que matrizes em .Net têm Comprimento, mas outros tipos de coleção têm Contagem? [fechadas]

23

Em C #, por exemplo, matrizes têm a propriedade Length. Mas outros tipos de coleção, como listas, etc. têm a propriedade Count. Existe uma razão pela qual esses dois são diferentes? Se sim, gostaria de saber.

Arunster
fonte
4
Não consigo encontrar meu apito de Lippert, então acho que não teremos uma boa resposta hoje :(
MetaFight
4
Apenas um palpite, já que não tenho conhecimento interno de como o CLR foi projetado: os detalhes de como as matrizes funcionam foram especificados antes dos tipos de coleção. Chamar a propriedade Length é o nome mais natural para ela, e como não havia um padrão preexistente com o qual se conformar, é isso que o designer de matrizes escolheu usar. Em seguida, as coleções foram especificadas posteriormente, mas Length não é apropriado para algumas coleções (implica linearidade, portanto, para coleções não ordenadas, não é um nome razoável), portanto, Count foi escolhido como mais consistente em termos logísticos.
Jules
4
Eu acho que esse post anterior do stackoverflow tem a resposta certa.
Doc Brown
6
@MetaFight: gravei recentemente uma série de vídeos educacionais e, a certa altura, mencionei que não fazia ideia do motivo pelo qual os designers usaram tanto a duração quanto a contagem. Sempre me pareceu bizarro. O comentário de Jules acima parece plausível.
Eric Lippert
3
Meta nota - elencei o 5º VTC, pois não acredito que essa pergunta possa ser respondida definitivamente. A resposta existente é uma resposta sólida e plausível, mas não é apoiada por evidências. Da mesma forma, o comentário de Lippert me leva a pensar que ninguém sabe a resposta, pois poderia ter sido devido a uma supervisão em oposição a uma decisão consciente.

Respostas:

30

Eles são nomeados de maneira diferente porque semanticamente são bem diferentes:

Contagem de uma coleção é o número de itens atualmente armazenados nela e pode potencialmente mudar com o tempo.

O comprimento de uma matriz é o número máximo de itens que pode conter (ele terá um comprimento de 10, mesmo que você não tenha armazenado muitos itens nela) e é imutável.

Exemplo:

Se eu tiver um balde que possa acomodar no máximo 100 bolas, ele terá um comprimento de 100. Se eu colocar 50 bolas nele, ele terá um Contagem de 50.

Se eu adicionar mais 10 bolas, o Count passa a 60, mas o Length ainda é 100. Para alterar o Length, preciso obter um balde diferente.

A matriz provavelmente usa a palavra Comprimento porque, sob o capô, está alocando um bloco contíguo (um comprimento) de memória com base na capacidade multiplicada pelo tamanho do item. Embora o fato de a classe List usar "Capacidade" para um conceito semelhante (embora mutável) sugerir matriz, pode usar a palavra "Comprimento" por razões históricas.

combinatória
fonte
12
A T[]com um comprimento de N sempre armazena exatamente N valores do tipo T. Semanticamente, nem todos esses valores podem ser significativos (podem ser, nullpor exemplo), mas eles existem. Isso é diferente do significado usual de capacidade (conforme usado por List<T>exemplo). Você está certo que Countpode mudar enquanto Lengthnão pode. Por outro lado, nada exige que Count, de fato, mude. Também é usado para coleções imutáveis.
@delnan oh querido. não percebeu que a palavra Capacidade já era usada em C # assim. Eu acidentalmente sobrecarreguei. Obrigado por apontar isso. Vou atualizar minha resposta para esclarecer.
combinatorics
Diferença entre capacidade e comprimento é - a capacidade pode mudar durante o ciclo de vida do objeto, enquanto o comprimento sempre permanece o mesmo. Se eu vir uma propriedade Length no objeto, eu assumiria que é o número máximo "rígido" (ou a borda / índice), enquanto que se eu vir a propriedade Capacity, eu assumiria que é o número máximo "flexível", que eu deveria verificar apenas contra se eu estou preocupado com o desempenho.
StupidOne 26/08/2015
@StupidOne: Se você seguir esse caminho, qualquer array também deverá ter uma countpropriedade-.
Deduplicator
1
Droga StringBuilder ... em Línguas rigorosas como Vigil a classe StringBuilder teria sido devidamente punido por convenção quebra github.com/munificent/vigil
Falco