.NET 8.0'da yeni [12]: Donmuş nesnelerin miktarı

Womanne

Member
.NET 8.0 iki yeni miktar nesne sunar FrozenSet<T> VE FrozenDictionary<T, T> Yeni İsimler Odasında System.Collections.Frozen. Bu dondurulmuş miktarlarla, oluşturulduktan sonra öğeleri değiştirmek, silmek veya silmek mümkün değildir. Bunun için .NET'te bulunan diğer miktarlarda nesneden daha hızlı içeren öğeleri sağlarlar.








Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Arayüz için iki yeni genişleme yöntemi ile dondurulmuş bir miktar oluşturulur IEnumerable<T>:

  • ToFrozenSet() kalabalığı bir uygulama olarak verir FrozenSet<T> Geriye doğru
  • ToFrozenDictionary() kalabalığı bir uygulama olarak verir FrozenDictionary<T, T> Geriye doğru.
Bu yöntemler bir “dondurulmuş” liste veya bir sözlük oluşturur (ad değer çiftleri ile).

2005'ten beri .NET Framework 2.0 arasında üç fark var ReadOnlyCollection<T> Ve şimdi .NET 8.0'da tanıtılan FrozenSet<T>:

  • Araçlar ReadOnlyCollection<T> sadece yapabileceğiniz başka bir miktarın görüşünü temsil edin AsReadOnly() oluşturuldu. Öte yandan, FrozentSet<T> Bağımsız bir miktar.
  • FrozenSet<T> dizin sahibi yok: frozenSet× Yani işe yaramıyor.
  • FrozentSet<T> Kopyalar içeremez, çünkü setler kopyalara izin vermez



Aşağıdaki kod kullanımını göstermektedir. FrozenSet Diğer miktarlarda nesne ile karşılaştırıldığında:


/// <summary>
/// Klasse System.Collections.Frozen.FrozenSet:
/// Eine nur lesbare einfache Liste.
/// Duplikate warden automatisch entfernt!
/// </summary>
public void FrozenSet()
{
CUI.H2(nameof(FrozenSet));

CUI.H3("FrozenSet aus Array");
int[] Zahlen = new int[] { 1, 2, 3 };
var f = Zahlen.ToFrozenSet();
Console.WriteLine(f.GetType().FullName);

CUI.H3("FrozenSet aus List");
List<int> list = new List<int> { 42, 10, 50, 42 };
FrozenSet<int> frozenSet = list.ToFrozenSet();
Console.WriteLine(frozenSet.GetType().FullName);
Console.WriteLine(frozenSet.Count); // nur 3, da keine Duplikate!

#region -------------------
// Änderung --> FrozenSet hat keinen Indexer,
// kein Add(), kein Remove()
//frozenSet[2] = 10; // Ändern nicht möglich
//frozenSet.Add(42); // Hinzufügen nicht möglich!!
//frozenSet.Remove(42); // Hinzufügen nicht möglich!!
#endregion

CUI.H3("ReadOnlyCollection aus List");
// gab es schon vor .NET 8.0 :) -->
// ReadOnlyCollection<T> ist nur Sicht auf eine andere Menge,
// die man mit AsReadOnly() erzeugt.
ReadOnlyCollection<int> readonlyList = list.AsReadOnly();
Console.WriteLine(readonlyList.GetType().FullName);
//readonlyList[2] = 10; // Ändern nicht möglich
//readonlyList.Add(42); // Hinzufügen nicht möglich!!

CUI.H3("ImmutableList aus List"); // gab es schon vor .NET 8.0 :)
ImmutableList<int> immutableList = list.ToImmutableList();
Console.WriteLine(immutableList.GetType().FullName);
//immutableList[2] = 10; // Ändern nicht möglich
var newImmutableList = immutableList.Add(42);
// Hinzufügen IST möglich, aber man bekommt eine neue Liste!

#region ------------------- Änderungen in Ursprungsliste
CUI.H3("Ein Element ändern");
list[2] += 1; // drittes Element der Ursprungsliste ändern
Console.WriteLine(list[2]); // 51
Console.WriteLine(readonlyList[2]); // 51
Console.WriteLine(immutableList.ElementAt(2)); // ist immer noch 50!
Console.WriteLine(frozenSet.ElementAt(2)); // ist immer noch 50!
#endregion

#region ------------------- Elemente hinzufügen in Ursprungsliste
CUI.H3("Ein Element hinzufügen");
list.Add(77); // Ein fünftes Element ergänzen
Console.WriteLine($"List count: {list.Count}"); // == 5!
// == 5 weil: ReadOnlyList ist eine Sicht auf List<T>!:
Console.WriteLine($"ReadOnlyList count: {readonlyList.Count}");
// == 4 weil vorheriger Zustand der Liste:
Console.WriteLine($"ImmutableList count: {immutableList.Count}");
// == 5 neue Liste:
Console.WriteLine($"new ImmutableList count: {newImmutableList.Count}");
// == 3 FrozenSET: vorheriger Zustand, keine Duplikate:
Console.WriteLine($"FrozenSet count: {frozenSet.Count}");
#endregion
}



Kullanımı FrozenDictionary Kodun aşağıdaki bölümünü gösterir:


public void FrozenDic()
{
CUI.H2(nameof(FrozenDic));
List<int> list = new List<int> { 42, 10, 50, 42 };

CUI.H3("FrozenDictionary aus List");
FrozenDictionary<int, string> frozenDic =
list.Distinct().ToFrozenDictionary(x => x,
x => "Zahl " + x.ToString());
Console.WriteLine(frozenDic.Count); // 3
// frozenDic[0] = 2;
// frozenDic.TryAdd(0, "Zahl 0"); // "Not supported"

Console.WriteLine(frozenDic.GetType().FullName);
}
}




(RME)
 
Üst