Hoş Geldiniz

Nesne yönelimli programlama ile pointer yapısının program execute olduktan sonra biz "dizi" veri yapısının elemanlarının nasıl eklendiği ve bütün elemanların nasıl olur da son elemana eşit olduğu problemiyle karşı karşıya geldiysen bu makale sizin için yararlı olacaktır. Öncelikle class içeriğimiz aşşağıda ki gibi olsun. Burada Eleman adlı dizimize degerler ekliyoruz.

 class Program
    {
        static int randomElemanSayisi;
        static Random rnd = new Random();
        static void Main(string[] args)
        {
            randomElemanSayisi = rnd.Next(10);

            Eleman[] elemanUretilen = new Eleman[randomElemanSayisi];
            
            Eleman elemanEklenecek = new Eleman();
            for (int i = 0; i < randomElemanSayisi; i++)
            {
                elemanEklenecek.Deger = 11 + rnd.Next(300);

                elemanEklenecek.LinkAddress = 0;

                elemanEklenecek.HomeAddress = elemanEklenecek.Deger % 11;
                Console.WriteLine("Anlık Tekil Elemanın Degeri="+elemanEklenecek.Deger);
                Console.WriteLine("");
                elemanUretilen[i] = elemanEklenecek;
                
                Console.WriteLine("Anlık Dizi Elemanın Degeri="+elemanUretilen[i].Deger);
                Console.WriteLine(""); Console.WriteLine("");
            }
            Console.WriteLine("------------");
            for (int i = 0; i < randomElemanSayisi; i++)
            {
                Console.WriteLine(elemanUretilen[i].Deger);
            }
            Console.ReadKey();
        }
    }

Eleman adlı nesne:


 public class Eleman
    {
        public int Deger { get; set; }
        public int HomeAddress { get; set; }
        public int LinkAddress { get; set; }
    }


Çıktı:


Anlık Tekil Elemanın Degeri=291

Anlık Dizi Elemanın Degeri=291


Anlık Tekil Elemanın Degeri=26

Anlık Dizi Elemanın Degeri=26


Anlık Tekil Elemanın Degeri=138

Anlık Dizi Elemanın Degeri=138


Anlık Tekil Elemanın Degeri=221

Anlık Dizi Elemanın Degeri=221


Anlık Tekil Elemanın Degeri=186

Anlık Dizi Elemanın Degeri=186


Anlık Tekil Elemanın Degeri=101

Anlık Dizi Elemanın Degeri=101


------------
101
101
101
101
101
101

Şimdi asıl meseleye gelelim: Neden aslında nesnenin her indisine o an eklemesini istediğim değeri eklemesine rağmen en sonunda random bir dizi içeriği elde etmeyi amaçladığım dizinin bütün elemanları aynı oluyor?





Aslına baktığımızda elemanUretilien adlı listemize adım adım indisler doğru bir şekilde yerleştirilse de bizim point ettiğimiz elemanEklenecek elemanının memory'de değeri değiştiği için ve son durumunda bütün dizi elemanları burayı point ettiği için böyle bir durum söz konusu oluyor. Çözüm:

  class Program
    {
        static int randomElemanSayisi;
        static Random rnd = new Random();
        static void Main(string[] args)
        {
            randomElemanSayisi = 5+rnd.Next(5);

            Eleman[] elemanUretilen = new Eleman[randomElemanSayisi];

            // Eleman elemanEklenecek = new Eleman();
            for (int i = 0; i < randomElemanSayisi; i++)
            {
                Eleman elemanEklenecek = new Eleman();
                elemanEklenecek.Deger = 11 + rnd.Next(300);

                elemanEklenecek.LinkAddress = 0;

                elemanEklenecek.HomeAddress = elemanEklenecek.Deger % 11;
                Console.WriteLine("Anlık Tekil Elemanın Degeri="+elemanEklenecek.Deger);
                Console.WriteLine("");
                elemanUretilen[i] = elemanEklenecek;
                
                Console.WriteLine("Anlık Dizi Elemanın Degeri="+elemanUretilen[i].Deger);
                Console.WriteLine(""); Console.WriteLine("");
            }
            Console.WriteLine("------------");
            for (int i = 0; i < randomElemanSayisi; i++)
            {
                Console.WriteLine(elemanUretilen[i].Deger);
            }
            Console.ReadKey();
        }
    }

Çözümün dez avantajı döngü içinde her tekrarda nesnenin oluşturulması için performans kaybı olmasıdır.

  • c sharp
  • .net
Yorum(0)