Random osztály és a kollekciók
.NET 8-tól kezdve a Random osztály két hasznos metódussal bővült. Random.GetItemssegítségével egy tömbből véletlenszerűen tudunk elemeket kiválasztani. A tömbbel visszatérő változat esetén lehetőségünk van meghatározni, hogy hány darab elemmel térjen vissza. A void visszatérésű változatokban a második paraméter a cél span-t határozza meg, amibe az elemek kiválasztása történik.
public T[] GetItems<T> (ReadOnlySpan<T> choices, int length);
public void GetItems<T> (ReadOnlySpan<T> choices, Span<T> destination);
public void GetItems<T> (ReadOnlySpan<T> choices, Span<T> destination);
A másik bevezetett metódus a Shuffle, amivel egy tömb elemeit tudjuk véletlenszerűen összekeverni:
public void Shuffle<T> (Span<T> values);
public void Shuffle<T> (T[] values);
Experimental attribútum
Az Experimental attribútum a System.Diagnostics.CodeAnalysis névtérben található és azért került bevezetésre, hogy egy osztálykönyvtár készítésekor lehetőségünk legyen megjelölni a kísérleti funkciókat, amelyek működése változhat. Ha egy ilyen attribútummal megjelölt típust vagy metódust használunk a kódunkban, akkor a fordító fordítási hibát generál.
Az Experimental attribútum konstruktorában meg kell adnunk egy diagnosztikai azonosítót szövegként. Ez azért lesz fontos, mert a fordítási hiba ennek az id-nek a megadásával kapcsolható ki, illetve az UrlFormat tulajdonság megadásával egy webcímet is rendelhetünk a funkció dokumentációjához:
public static class ExperimentalTest
{
[Experimental("TestFoo", UrlFormat = "http://dokumentacio/hogymiert")]
public static void Test()
{
//kód
}
}
A fenti kódban a TestFoo id került hozzárendelésre a funkcióhoz. Ennek ismeretében ha azt szeretnénk, hogy a Test() metódus hívása ne generáljon fordítási hibát, akkor ilyen módon kell meghívnunk:
#pragma warning disable TestFoo
ExperimentalTest.Test();
#pragma warning restore TestFoo
A #pragma warning disable utasítás egy megadott azonosítójú fordítási figyelmeztetést kikapcsol, a #pragma warning restore pedig ismételten engedélyezi.
UnreachableException
Az UnreachableException a System.Diagnostics névtérben található és olyan kivétel szituációk jelzésére szolgál, amelyek a szoftver jelenlegi állapotában nem szabadna, hogy megtörténjenek. Nézzünk egy példát. Tételezzük fel, hogy van egy enum típusunk pár definiált értékkel:
public enum Teszt
{
Egyik,
Masik,
}
Tételezzük fel azt is, hogy ezen értékek egy döntést befolyásolnak a kódunkban, amit mondjuk egy switch-case segítségével valósítunk meg. Ebben az esetben az enum értékeit lekezeljük egy-egy case ággal, a default ágban meg mondjuk dobunk egy kivételt, hogy nem várt értéket kaptunk. Erre használhatnánk például az InvalidOperationException osztályt is, de valóban nem várt állapotról van szó?
Teszt t = Teszt.Egyik;
switch (t)
{
case Teszt.Egyik:
//kód
break;
case Teszt.Masik:
//kód
break;
default:
throw new UnreachableException("Unknown value");
}
Természetesen nem, mivel a kód megírásakor nem is létezik több lehetséges állapot, amit az enum típusunk felvehetne. Ilyenkor dobhatunk egy UnreachableException kivételt, amivel jelezzük, hogy ennek az állapotnak egyáltalán nem szabadott volna bekövetkeznie.
Ez azért fontos és hasznos, mert a kód későbbi bővítése során egyértelműen érthető lesz, hogy mire gondolt az eredeti szerző.