Por que devo implementar ICloneable em c #?

Você pode me explicar por que eu deveria herdar ICloneable e implementar o método Clone() ?

Se eu quiser fazer uma cópia profunda, não posso simplesmente implementar meu método? Vamos dizer MyClone() ?

Por que eu deveria herdar ICloneable ? Quais são as vantagens? É apenas uma questão de tornar o código “mais legível”?

Você não deveria. A Microsoft recomenda contra a implementação de ICloneable porque não há nenhuma indicação clara da interface se o seu método Clone executa um Clone “profundo” ou “superficial”.

Veja este blog de Brad Abrams em 2003 (!) Para mais informações.

A interface ICloneable por si só não é muito útil, o que significa que realmente não há muitas situações em que é útil saber que um object é clonável sem saber mais nada sobre ele. Esta é uma situação muito diferente de, por exemplo, IEnumerable ou IDisposable ; Há muitas situações em que é útil aceitar um IEnumerable sem saber nada além de como enumerá-lo.

Por outro lado, ICloneable pode ser útil quando aplicado como uma restrição genérica junto com outras restrições. Por exemplo, uma class base pode oferecer suporte a vários derivados, alguns dos quais poderiam ser clonados de maneira útil, e alguns deles não poderiam. Se o próprio tipo base expusesse uma interface de clonagem pública, qualquer tipo derivado que não pudesse ser clonado violaria o Princípio de Substituição Liskov. A maneira de evitar esse problema é ter o tipo básico de clonagem de suporte usando um método Protegido e permitir que tipos derivados implementem uma interface de clonagem pública da forma que acharem melhor.

Uma vez realizado, um método que queira aceitar um object do tipo WonderfulBase , e precisar cloná-lo, pode ser codificado para aceitar um object WonderfulBase que suporte clonagem (usando um parâmetro de tipo genérico com tipo base e ICloneable restrições). Embora a interface ICloneable não indicasse em si uma clonagem profunda ou superficial, a documentação do WonderfulBase indicaria se o WonderfulBase clonável deveria ser clonado em profundidade ou raso. Essencialmente, a interface ICloneable não realizaria nada que não fosse conseguido definindo ICloneableWonderfulBase , exceto que evitaria ter que definir nomes diferentes para cada class base clonável diferente.

ICloneable é um desses artefatos na BCL que tem sido controverso. Não há razão real para que a IMHO a implemente. Com isso dito, se eu vou criar um método clone, então eu implemento ICloneable , e eu forneço minha própria versão forte do Clone .

O problema com ICloneable é que nunca indicado se Clone foi uma cópia superficial ou profunda, que são coisas muito diferentes. O fato de que não há ICloneable pode ser uma indicação sobre os pensamentos da Microsoft sobre ICloneable

Matt está correto, não use. Crie seu próprio método Copy() (ou nome similar) e deixe claro na sua API pública se o seu método está criando uma cópia profunda ou superficial do seu object.