Kurucu versus Clone()
C# (derin) bir sınıf için kopya işlevsellik eklemek için tercih edilen yolu nedir? Bir kopya yapıcı veya ICloneable yerine türetmek uygulamak ve Clone() yöntemi uygulamak gerekir?
Açıklama: ""Parantez çünkü alakasız olduğunu düşündüm. içinde derin yazdım Görünüşe göre Diğerleri whether a copy constructor/operator/function needs to make clear which copy variant it implements sordum katılmıyorum.
CEVAP
ICloneable türetmek gerekir.
Sebebi Microsoft tasarlanmış .net çerçeve hiç belirtilmiş olup Clone() yöntem ICloneable ... olması gereken derin veya sığ klon, böylece arayüz anlamsal kırık olarak arayanlar olmayacak biliyorum olsun arayacak derin veya sığ klon nesne.
Bunun yerine, DeepClone() (ShallowClone()) yöntemleri ile IDeepCloneable (IShallowCloneable) kendi arayüzleri tanımlamak gerekir.
Tanımlayabilirsiniz iki arabirimi, bir genel parametre için destek kesinlikle yazılmış klonlama ve biri olmadan tutmak için zayıf yazılı klonlama yeteneği için zaman çalıştığınız koleksiyonları farklı cloneable nesneler:
public interface IDeepCloneable
{
object DeepClone();
}
public interface IDeepCloneable<T> : IDeepCloneable
{
T DeepClone();
}
Sonra böyle: uygulamak istiyorsunuz
public class SampleClass : IDeepCloneable<SampleClass>
{
public SampleClass DeepClone()
{
// Deep clone your object
return ...;
}
object IDeepCloneable.DeepClone()
{
return this.DeepClone();
}
}
Arabirimleri bir kopyasını farklı olarak tarif yapıcı kullanmayı tercih ediyorum genelde niyeti açık tutar. Bir kopya yapıcı muhtemelen derin bir klon olarak kabul olurdu, ama kesinlikle İDeepClonable bir arabirim kullanarak net bir niyet olarak çok değil.
Bu tartışılan bir konu .net 14 ** Brad Abrams' blog

C Kurucu yapı ?...
Ne kadar dengesiz bir bağlantı üzerind...
Yürütmesini GCC olarak "cc" ...
Neden değer Ot kurucu üye fonksiyonlar...
' "en iyi uygulama s git clo...