Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  .Net Framework'de tanımlı klonlama arayüzü. Bu arayüzü implement eden bir sınıfın klonlanabilir olduğu söylenir.

Klonlamak nedir?

Programlamada değişkenler için kullanılan iki tür veri tipi vardır: Değer tipleri ve referans tipleri (value type ve reference type). Değer tiplerinin özelliği; bu tipteki değişkenlerin direk değeri saklaması, referans tiplerinin özelliği ise bu tip değişkenlerde değerin bulunduğu RAM bölgesinin adresinin saklanmasıdır.

int, string, double, struct tipleri değer tipleridir. Değişkenleri direk değer taşır.
ArrayList, TextBox, vb. sınıf tipleri ise referans tipleridir. Değişkenleri adres saklar.

Bir değişkenin sahip olduğu değer stack denilen RAM bölgesinde saklanır. Değer tipindeki değişkenler bu bölgede değerlerini saklarken, referans tipindeki değişkenler bu bölgede işaret ettikleri değerin adresini saklar. Bu adres heap denilen RAM bölgesinin adresidir. Dolayısıyla referans tiplerin değeri heap'te adresi stack'tedir.

Elinizde aynı tip iki değişken olsun; x ve y. Bunlardan birini diğerine atadığınızda (yani x=y) y'nin stack'deki değerini x'e kopyalamış olursunuz. Değer tipindeki değişkenler için değer kopyalanmış olur. Ne güzel. Ama referans tipindeki değişkenler için adres kopyalanmış olur. Bu durumda iki değişken heap'teki aynı RAM alanını (dolayısıyla aynı değeri) göstermiş olur.

Bunu örnek üzerinde inceleyelim:

// değer tipindeki değişkenleri birbirine atamak
int x = 3;
int y = x;
y = 4;
Console.WriteLine(x); // 3 yazar. çünkü x'in değeri 3'tür. y'de önce 3'tü, sonra 4 oldu.

// referans tipindeki değişkenleri birbirine atamak
Kisi x = new Kisi("Ali");
Kisi y = x;
y.Ad = "Ahmet";
Console.WriteLine(x.Ad); // Ahmet yazar. Halbuki x'in adı Ali idi. Ama y=x yapmakla y'ye x'teki
                         // adresi kopyalamış olduk. y'nin adını değiştirince x'in de adı değişti.

Referans tipli değişkenlerin birbirine atanması sırasında ortaya çıkan bu durum bazen problemlere neden olur. İstersiniz ki; x'i y'ye atadıktan sonra, birinin değerini değiştirdiğimde diğeri değişmesin. Bu problemin çözümü x'i önce klonlamak (adresi farklı bir kopyasını elde etmek) ve bunu y'ye atamaktır.

Bu işlemi yapmak için Kisi sınıfına Clone adında bir metod eklersiniz. Şöyle:

public class Kisi
{
    public string Ad;

    public object Clone()
    {
        Kisi k = new Kisi();
        k.Ad = this.Ad;
        return k;
    }
}

Clone() metodunu incelerseniz burada k = new Kisi(); satırıyla yeni bir Kisi oluşturuluyor, varolan Kisi'nin değerleri buna atanıyor ve bu yeni k değişkeni döndürülüyor. İşte klonlamak budur.

ICloneable interface'ini kendini yukarıdaki gibi klonlayabilen sınıflar için kullanırsınız.
public class Kisi : ICloneable
gibi..
fizikci
21 Kasım 2005 15:01
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1078 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen