Pergunta

Eu estava perguntando recentemente alguém por que ele preferiu voltar uma matriz de rigidez ao longo de um IList. Eu sempre pensei que a programação contra uma interface foi o programa de forma mais flexível e melhor quando confrontados com um projeto de ter uma vida longa. Por isso me pareceu estranho quando ele respondeu:

Normalmente, preferem tipos imutáveis os mais mutáveis. matrizes são imutável. IList não é.

Eu não estou inteiramente certo eu entendo esta declaração. Alguém pode ajudar a esclarecer isso?

Obrigado por qualquer ajuda que vocês podem proporcionar.

Foi útil?

Solução

Eu acho que ele talvez pensou desde propriedade length de uma matriz é imutável, então de alguma forma matrizes são mais imutável do que IList ou talvez ele usou a palavra errada e concreto trocado com imutável. Quem sabe, mas é uma resposta estranha.

Eu acho que com o retorno de uma lista há algo ligeiramente implícita que é ok para modificá-lo ou que podem mudar ao retornar um array não implica que tanto.

Por exemplo, se você tinha um modelo de objeto em cima de um repositório e tinha um método como GetCars () que retornou uma lista e uma serra programador júnior cars.Add (Car c) ... Você acha que ele estava completamente insano para pensar cars.Add (new Car ()) pode realmente adicionar um carro para o repositório? Arrays são apenas inerentemente mais explícito.

Eu acho que o uso de lista é mais apropriado nas propriedades, como Page.Controls.Add

Eu prefiro retornar matrizes mais frequentemente do que lista por várias razões.

  • Habit. Coleções em 1.0 / 1.1 SUGADO

  • Eu prefiro que meus métodos retornam o objeto mais simples e mais leve possível. Se eu precisar fazer uma matriz de uma lista é trivial.

  • Eles podem ser usados ??em .NET 1.1 e reduz a superfície são de refatoração se eu precisasse para apoiar as versões mais antigas do tempo de execução posso reutilizar pelo menos algum do meu código ou aplicar um modelo de objeto idêntico.

Outras dicas

Quem "ele" é, está em 100% errado sobre o tema. Arrays são uma muito mutável. Esta é de facto uma das razões para não retornar um array. Não há maneira de evitar um chamador de alterar os elementos de um array para o que quiserem.

A única maneira em que um arrray é imutável está em sua extensão. Uma vez que uma matriz é alocada, de comprimento não pode ser alterado. Mesmo APIs como Array.Resize realmente não redimensionar a matriz, eles só atribuir um novo nome, copiar o conteúdo e retornar o novo array (por referência, neste caso).

Eu concordo, porém, que há muitos casos em que é melhor para retornar dados imutáveis. A principal é que ele permite que você retornar uma referência a uma coleção interna de uma classe sem fazer uma cópia completa e, ao mesmo tempo, impedindo o chamador de mexer com o seu estado interno. A maioria das coleções mutáveis ??não pode fazer tais garantias.

Eu sempre prefiro um ReadOnlyCollection . Todas as vantagens de uma lista, mas somente leitura.

Um ponto que ele poderia ter significado é que IList inclui a inserir, remover e adicionar métodos, de modo a coleção em si pode ser modificado. T [], por outro lado, não pode ter elementos adicionados a ele.

Devo acrescentar que FxCop recomenda retornar ReadOnlyCollection em vez. O indexador é somente leitura, para que você não pode mudar os elementos, eo suplemento e outros tais métodos toda lance NotSupportedException.

Em princípio ele está certo, mas ele não sabe como praticá-lo corretamente ...

Normalmente, preferem tipos imutáveis os mais mutáveis.

Isso está correto. tipos imutáveis ??são mais agradáveis ??para trabalhar com

Arrays são imutáveis. IList não é.

Isso não é correto. Nenhuma das duas coisas são imutáveis.

Se você quiser retornar uma coleção que é imutável, retornar um IEnumerable<T> ou um ReadOnlyCollection<T> (usando o método List<T>.AsReadOnly). Ainda aqueles não protege os objetos se eles próprios não são imutáveis. Eventhough você só pode ler a partir das coleções, você ainda pode alterar os dados em cada objeto se eles permitem isso.

Além disso, você deve considerar a "propriedade" da coleção que você está retornando. Se você estiver criando uma matriz para o único propósito de devolvê-lo, então não há razão para não dar controle total para ele. Se, por outro lado estão retornando uma coleção que é um membro da classe, você só deve permitir tão pouco acesso a ele como é necessária.

Eu não entendo isso também. Arrays são muito mutáveis, exceto para o seu tamanho. Elementos individuais podem ainda ser modificados. Talvez ele queria dizer matrizes são tipos de valor e Listas são tipos de referência. Eu não sei.

De qualquer forma, você provavelmente deve ter um olhar para opinião de Eric Lippert sobre o assunto. Poderia fornecê-lo com um pouco de munição para a discussão também.

Talvez esse alguém não sabe o que ele está falando?

A razão para usar uma interface como tipo de retorno sobre o próprio tipo real, é para esconder a implementação interna do chamador. Este allowes a implementação de mudar o tipo real sem repurcusions para o resto da aplicação.

Não faz qualquer sentido para copiar uma coleção usada internamente em uma matriz para uso externo, por nenhuma outra razão do que mutáveis ??ou imutáveis.

questões separadas são: - retornar uma lista de dados ou não rigidez. IList ou IList. A utilização de dados rigidez é sempre preferível. - mutável ou imutável. ICollection, IList ou IEnumerator Retorno com o que você deseja permitir aos dados. Para obter uma lista de retorno somente leitura apenas uma IEnumerator. Se o chamador é permitido modificar o ICollection coleção uso ou IList.

Basicamente ele está dizendo "nós preferimos estruturas que não podem ser mudadas facilmente em tempo de execução, porque acreditamos que eles sejam menos vulneráveis ??a erros." Se isso é correto, neste caso, é outra questão.

Talvez ele quis dizer o tamanho da matriz como "imutável"? Basicamente, você declarar o tamanho de uma vez você está preso com ele. Com listas, você sempre pode usar "Adicionar".

I supor que se que você está certeza sobre o tamanho da lista, talvez matriz é um pouco mais rápido?

Bem. IList é mutável no sentido de que você pode adicionar e remover itens, em vez de apenas alterar os itens que já estão lá. Uma matriz permite mexer com itens individuais, mas um determinado índice nunca se tornará totalmente inválido. Há uma série de razões para preferir imutabilidade -. Torna a área de superfície para a corrupção de dados acidental muito menor, por exemplo

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