4 ms·
That is a different approach, but I don't think you've demonstrated why it's better. Seems like that approach forces you to introduce a new scope for every reso
by usefulcat 8mo ago
That is a different approach, but I don't think you've demonstrated why it's better. Seems like that approach forces you to introduce a new scope for every resource, which might otherwise be unnecessary:
using (var resource1 = acquire() {
using (var resource2 = acquire()) {
using (var resource3 = acquire()) {
// use resources here..
}
}
}
Compared to:
var resource1 = acquire();
defer { release(resource1); }
var resource2 = acquire();
defer { release(resource2); }
var resource3 = acquire();
defer { release(resource3); }
// use resources here
Of course if you want the extra scopes (for whatever reason), you can still do that with defer, you're just not forced to.
- sparkie 8mo agoWhile the macro version doesn't permit this, if it were built-in syntax (as in C#) we can write something like: using (auto res1 = acquire1(); free(res1)) using (auto res2 = acquire2(); free(res2)) using (auto res3 = acquire3(); free(res3)) { // use resources here } // free(res3); free(res2); free(res1); called in that order. The argument for this approach is it is structural. `defer` statements are not structural control flow: They're `goto` or `comefrom` in disguise. --- Even if we didn't want to introduce new scope, we could have something like F#'s `use`[1], which makes the resource available until the end of the scope it was introduced. use auto res1 = acquire1() defer { free(res1); }; use auto res2 = acquire2() defer { free(res2); }; use auto res3 = acquire3() defer { free(res3); }; // use resources here In either case (using or use-defer), the acquisition and release are coupled together in the code. With `defer` statements they're scattered as separate statements. The main argument for `defer` is to keep the acquisition and release of resources together in code, but defer statements fail at doing that. [1]:https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/resource-management-the-use-keyword#use-binding https://learn.microsoft.com/en-us/dotnet/fsharp/language-ref...