SORU
9 EYLÜL 2008, Salı


Yapılar bir listedeki bir elemanın değerinin değiştirilmesi

Yapılar bir listesi var ve bir elemanı değiştirmek istiyorum. Örneğin :

MyList.Add(new MyStruct("john");
MyList.Add(new MyStruct("peter");

Şimdi bir eleman değiştirmek istiyorum:

MyList[1].Name = "bob"

Ben denemek ve bunu yapmak ancak, her ne zaman aşağıdaki hatayı alıyorum:

Geri dönemez değeri değiştir Sistem.Koleksiyonları.Jenerik.Liste.bu[int] değildir çünkü bir değişken

Eğer sınıfları bir listesini kullanıyorum, sorun yok.

Cevap yapılar değer türü olmakla ilgisi var sanırım.

Gibi davranmalıyım yapılar bir listesi varsalt okunur? Eğer listedeki öğeleri değiştirmek için ihtiyacım olursa o zaman sınıflar ve yapılar değil kullanmalıyım?

CEVAP
9 EYLÜL 2008, Salı


Tam olarak değil. Sınıf veya yapı koleksiyonları depolamak için ihtiyaç tarafından tahrik olmamalı gibi bir tip tasarımı:) 'anlambilim' gerekli bak

Görüyorsun sorun değer türü semantiği kaynaklanmaktadır. Her değer türü değişken/referans yeni bir örneğidir. Derken

Struct obItem = MyList[1];

ne yapı yeni bir örneği oluşturulur ve tüm üyeleri tek tek kopyalanır. MyList[1] 2 yani bir klonu var yani örnekleri. Şimdi obİtem değiştirirseniz, orijinal etkilemez.

obItem.Name = "Gishu";  // MyList[1].Name still remains "peter"

Şimdi 2 dakika burada (Bu biraz benim için yaptı.. yutkunmak alır :)sabredin Eğer gerçekten yapılar topluluğu içinde saklı ve Sorunuzun içinde belirttiğiniz gibi değiştirilmesi gerekiyorsa, yapı arabirim göstermek yapmak içinAncak bu boks neden olur). O zaman kutulu nesneyi ifade eden bir arayüz referansı ile gerçek yapı değiştirebilirsiniz.

Aşağıdaki kod parçası, ben sadece yukarıda söylediklerini göstermektedir

public interface IMyStructModifier
{      String Name { set;        }       }
public struct MyStruct : IMyStructModifier ...

List<Object> obList = new List<object>();
obList.Add(new MyStruct("ABC"));
obList.Add(new MyStruct("DEF"));

MyStruct temp = (MyStruct)obList[1];
temp.Name = "Gishu";
foreach (MyStruct s in obList) // => "ABC", "DEF"
{      Console.WriteLine(s.Name);            }

 IMyStructModifier temp2 = obList[1] as IMyStructModifier;
 temp2.Name = "Now Gishu";
 foreach (MyStruct s in obList) // => "ABC", "Now Gishu"
 {     Console.WriteLine(s.Name);       }

HTH. Güzel Soru.< / ^ br . Güncelleme:@Hath - eğer bu kadar basit bir şey Gözden kaçırmışım olmadığını kontrol etmek için bana çalışan vardı. (Belirleyici özellikleri vermezsek tutarsız olacaktır ve yöntemleri - yaptı .Net evren hala dengeli :)< / ^ br . Kurucu yöntem işe yaramıyor< / ^ br . obList2[1] değiştirilmesi olan bir kopyasını döndürür. Liste kalır özgün yapı değişmemiş. Set-ile-Arayüzü yapacak tek şey bu gibi görünüyor.

List<MyStruct> obList2 = new List<MyStruct>();
obList2.Add(new MyStruct("ABC"));
obList2.Add(new MyStruct("DEF"));
obList2[1].SetName("WTH");
foreach (MyStruct s in obList2) // => "ABC", "DEF"
{
  Console.WriteLine(s.Name);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andony5589

    andony5589

    7 Aralık 2011
  • androidandme

    androidandme

    10 Mart 2009
  • William Hyde

    William Hyde

    23 HAZİRAN 2008