Bu kodda ne yanlış var? – 3
Aşağıdaki kodu çalıştırdığımızda Console’a “Bir”, “İki”, “Üç” yazdığını görüyoruz.
Sizce neden “Dört” elemanı yazılmıyor?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BuKoddaNeYanlisVar
{
class Program
{
private List<string> _items = new List<string>();
public List<string> Items
{
get { return _items.ToList(); }
set { _items = value; }
}
static void Main(string[] args)
{
Program program = new Program();
program.Items = new List<string> { "Bir", "İki", "Üç" };
program.Items.Add("Dört");
foreach (var item in program.Items)
Console.WriteLine(item);
Console.ReadLine();
}
}
}
İlgili diğer başlıklar:
Items property si icin yazilan get metodunda (“get { return _items.ToList(); }”) ToList() metodu _items nesnesi uzerinde sorgu calistirip bize sonuc dondurmektedir. Boylelikle elimizde _items nesnesi degil, _items nesnesi uzerinde calistirilmis bir sorgudan elde edilen sonuc listesi bulunmaktadir. Bu nedenle “program.Items.Add(“Dört”);” satiri ile “Dört” stringi bu sonuc listesine eklenmektedir. Bir sonraki satirda foreach e sokulan liste ise yine _items listesi uzerinde calistirilan sorgudan olusan yeni bir liste olmaktadir ve “Dört” string ini kapsamammaktadir. Get metodu “get { return _items; }” seklinde degistirilirse hata giderilir.
nedense hemen bakınca gördüm yorumu okumamıştım..!
private List _items = new List(); public List Items { get { return _items.ToList(); } set { _items = value; } } static void Main(string[] args) { Program program = new Program(); program.Items = new List { "Bir", "İki", "Üç" }; program.Items.Add("Dört"); foreach (var item in program.Items) Console.WriteLine(item); Console.ReadLine(); }private List _items = new List(); public List Items { get { return _items; } set { _items = value; } } static void Main(string[] args) { Program program = new Program(); program.Items = new List { "Bir", "İki", "Üç" }; program.Items.Add("Dört"); foreach (var item in program.Items) Console.WriteLine(item); Console.ReadLine(); }@tahsin balcı
Arkadaşın dediği doğru;
Zaten Reflector den de bakınca aşağıdaki kod vardır toList() metodu için,
“return new List…” yani yeni bir referansla geri dönüyor. eski _items ın referansını tutmuyor artık
public static List ToList(this IEnumerable source)
{
if (source == null)
{
throw Error.ArgumentNull(“source”);
}
return new List(source);
}
.Net 2.0 ve 3.5′te yaptığım denemede bir List örneğinin ToList() gibi bir metodu olmadığını gördüm. Zaten oluşan syntax hatası beni ToList() metodunu silmeye zorladı.
veli sezer 2.0 da yok 3.5 ve 4.0 de var