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
-
January 01, 2018
-
January 01, 2018
-
December 12, 2017
-
November 11, 2017
-
October 10, 2017
-
October 10, 2017
Yorum(0)