Pergunta

Eu tenho um tipo que considero usá -lo como estrutura.

  • Representa um único valor
  • É imutável

Mas o problema é que possui 6 campos de int.

Então, qual solução eu devo usar para este tipo?

  1. continuar usando a estrutura?
  2. mudar para a classe?
  3. ou embalasse 6 números inteiros em uma variedade de int, então ele tem apenas um campo

EDITAR

O tamanho da estrutura com 6 campos inteiros é de 24 bytes, o que é enorme para passar. O tamanho recomendado para a estrutura não é superior a 16 bytes

Foi útil?

Solução

Depende de como você vai usá -lo?

  1. Você vai alocar muito vs. passar muito?
  2. Será consumido pelo código de terceiros? Nesse caso, as classes normalmente oferecem mais flexibilidade.
  3. Você quer struct vs. semântica de classe? Por exemplo, não indicável?
  4. Você se beneficiaria de ter algumas instâncias pré-criadas dessa classe que podem ser reutilizadas para representar casos especiais? Semelhante a String.Empty. Nesse caso, você se beneficiaria de uma classe.

É difícil responder apenas das informações que você forneceu em sua pergunta.

Outras dicas

Tenha cuidado com o boxe. Se sua estrutura for consumida por um método que espera um objeto, ela será coagida em um objeto e você terá um desempenho potencial.

Aqui está um referência Isso explica isso com mais detalhes.

Eu faria uma aula (nº 2) e então você não precisaria se preocupar com isso.

O uso de uma matriz de seis números inteiros (nº 3) provavelmente tornaria seu código mais difícil de ler. Uma classe com identificadores descritivos para cada int seria muito melhor.

Sem ver sua estrutura, é difícil dizer nada definitivamente. Mas eu suspeito que você deve deixar isso como uma estrutura.

Que tal a WriteOnce<int[]> ?

Sugiro escrever um pouco de referência para medir o desempenho das diferentes opções, essa é a única maneira de saber com certeza. Você pode se surpreender com os resultados (muitas vezes sou).

(Estou assumindo que sua preocupação aqui é desempenho.)

Se o titular de dados for imutável, a questão da classe estrutura versus provavelmente dependerá do número médio de referências que existiriam em cada instância. Se alguém tiver uma matriz de vinte e quatro estercruz [1000], essa matriz levará 24.000 bytes, independentemente de todo elemento manter um valor diferente, todos os elementos mantêm o mesmo valor ou em algum lugar intermediário. Se alguém tiver uma matriz de vinte e quatroclass [1000], essa matriz levará 4.000 ou 8.000 bytes (para sistemas de 32/64 bits), e cada instância distinta de vintefourbyteclass criada terá cerca de 48 bytes. Se todos os elementos da matriz mantiveram uma referência ao mesmo objeto TwentyFourbyTeclass, o total será de 4.048 ou 8.048 bytes. Se todos os elementos da matriz mantiverem referências a diferentes objetos de vinte e quatro grois, o total será de 52.000 ou 56.000 bytes.

Quanto ao desempenho em tempo de execução, o melhor desempenho que você pode obter geralmente passará estruturas por referência. As estruturas de passagem por valor exigirão copiá -las, o que pode ser caro para estruturas maiores que 16 bytes (.NET inclui otimizações para estruturas 16 bytes ou menores), mas o custo de um tipo de valor por referência é o mesmo, seja 1 byte ou 16.000 bytes.

In general, when storing more than two pieces of related data I like to make a class that binds them together. Especially if I will be passing them around as a unit.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top