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
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);
}
Nasıl bir listedeki bir elemanın tüm t...
Neden değişken yapılar“”? kötü...
Neden yapılar benim dizi çok fazla bel...
jQuery: jQuery gizli bir elemanın yüks...
Nasıl bir WPF combo yapmak kutusu XAML...