Ana Sayfa > C#, Programlama > Bu kodda ne yanlış var? – 3

Bu kodda ne yanlış var? – 3

18 Şubat 2010

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:



  1. Murat Aras
    Şubat 22nd, 2010 at 13:38 | #1

    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.

  2. tahsin balcı
    Mayıs 4th, 2010 at 12:52 | #2

    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();
    }
  3. Özkan Danacı
    Mayıs 13th, 2010 at 13:23 | #3

    @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);
    }

  4. Kasım 2nd, 2010 at 09:14 | #4

    .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ı.

  5. Talat eri
    Kasım 28th, 2011 at 02:14 | #5

    veli sezer 2.0 da yok 3.5 ve 4.0 de var