Если вы имеете в виду, что копируемые объекты («первый уровень» на графике) являются неизменяемыми, тогда создание мелкой копии является хорошей практикой.
Кроме того, неизменные объекты могут иметь методы-клоны, возвращающие себя, поэтому, если объект, содержащий их, «глубоко скопирован», это действительно будет такая мелкая копия. System.String, например, реализует ICloneable с:
public object Clone()
{
return this;
}
Лично я бы порекомендовал следующий вариант, который уменьшает необходимость приведения, когда не вызывается через интерфейс:
public class MyImmutableClass : ICloneable
{
public MyImmutableClass Clone()
{
return this;
}
ICloneable.Clone()
{
return this;
}
}