resource-cleanup az IDispose interfészt használja annak jelzésére, hogy egy objektum erőforrását vagy más programállapotát fel kell szabadítani vagy vissza kell állítani, amikor az objektumra már nincs szükség (és hogy a szemétgyűjtőre támaszkodva ez nem valósulna meg, illetve nem biztosítaná a szükséges szintű kontrollt), valamint hogy az IDisposable.Dispose() metódus a természetes hely az ilyen takarítási műveletekhez.
Létezik egy másik szerkezet is, a using blokk, amely a hívó szemszögéből lehetővé teszi, hogy az összes erőforrás élettartamának kezelését egyetlen utasításba gyűjtsük.
using (var file = new File("my_secrets"))
{
file.WriteSecret("xxxxxxx");
}
A fenti példában a file-hoz kapcsolódó fájlrendszer-erőforrások visszaadódnak az operációs rendszernek, amikor a using blokkból kilépünk.
Ahhoz, hogy a minta működjön, a using utasításban szereplő változónak referenciatípusnak kell lennie, amely megvalósítja az IDisposable interfészt, és a Dispose() metódusában fel kell szabadítania az erőforrásokat, illetve vissza kell állítania a program állapotát.
A C# 8 finomítást vezet be a mintába. A using utasítás egy blokk elejére helyezhető.
using var drawingResource = some_provided_or_new_object;
try
{
drawingResource.DrawSomething();
}
catch (Exception)
{
throw;
}
A Java-fejlesztők felismerhetik ezt a Java 7-ben bevezetett automatikus erőforrás-kezelés mechanizmus analógjaként.
Újra az ORM (objektum-relációs leképezés) rendszeren dolgozol, amelyet a object-relational-mapping feladatban ismertettünk.
Az ORM használatát vizsgáló elemzésünk szerint a tranzakciók 95%-a egyetlen hívó metódusból indul ki, ezért úgy döntöttünk, hogy célszerűbb lenne egyetlen olyan ORM-metódus, amely megnyitja, kiírja és véglegesíti a tranzakciót.
Az adatbázisnak a következő példánymetódusai vannak:
Database.BeginTransaction() elindít egy tranzakciót az adatbázison.Database.Write(string data) adatot ír az adatbázisba a tranzakción belül. Ha hibás adatot kap, kivétel dobódik. Ha úgy próbálod meghívni ezt a metódust, hogy előtte nem hívtad meg a BeginTransaction() metódust, kivétel dobódik. Sikeres hívás esetén az adatbázis belső állapota DataWritten lesz.Database.EndTransaction() véglegesíti a tranzakciót az adatbázisban. Kivételt dobhat, ha nem sikerül lezárnia a tranzakciót, vagy ha a Database.BeginTransaction() metódust nem hívták meg.Database.Dispose() hívása rendbe teszi az adatbázist, ha a tranzakció közben kivétel dobódik. Ekkor az adatbázis állapota Closed lesz.Valósítsd meg az Orm.Write() metódust úgy, hogy elindít egy adatbázis-tranzakciót, kiírja a kapott adatot, majd véglegesíti a tranzakciót. Minden kivételt, az InvalidOperationException-t is beleértve, hagyni kell, hogy eljusson a hívóhoz, naplózás vagy bármilyen más beavatkozás nélkül.
Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed
Néhány hónap telt el azóta, hogy bevezettük az Orm.Write() metódust, és megosztott a csapat. Sok fejlesztő szeretné, ha az ORM kezelné a hibákat, amikor kivétel dobódik, és egyszerűen csak a siker jelzését adná vissza a hívónak.
Valósítsd meg az Orm.WriteSafely() metódust úgy, hogy elindít egy adatbázis-tranzakciót, kiírja a kapott adatot, majd véglegesíti a tranzakciót (a fentiek szerint). true-t adjon vissza, ha az írás sikeres volt, egyébként false-t. Ne próbáld naplózni a kivételt.
Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.