With statement become like C#'s using?
Jacob Carlborg
doob at me.com
Tue Aug 6 07:24:01 PDT 2013
On 2013-08-05 14:40, Bosak wrote:
> In C# there is this using construct:
>
> using(Bitmap image = this.OpenImage("filename.bmp")) {
> image.Name = "foo";
> //use image like image.sth
> }
>
> which is translated to:
>
> {
> Bitmap image = this.OpenImage("filename.bmp");
> try {
> image.Name = "foo";
> //use image like image.sth
> }
> finally {
> IDisposable obj = image as IDisposable;
> if(obj != null)
> obj.Dispose();
> }
> }
>
> I know that the with statement is different, but it can be improved so
> that you can declare things in it like an using statement:
>
> with(Bitmap image = open("filename.bmp")) {
> name = "foo";
> //no need to specify image.sth
> }
>
> or even a more implicit one:
> with(open("filename.bmp")) {
> //ditto
> }
>
> And both of the above to be translated to:
>
> {
> Bitmap temp = expression;
> //use bitmap
> delete temp; // Call destructor/finallizer of the object
> //I'm not sure if delete was the proper way to call a destructor in D
> }
>
> And I hope you got the point. Tell me what you think.
You can replicate the C# using statement with a library function:
module test;
import std.stdio;
alias writeln println;
template isDisposable (T)
{
enum isDisposable = __traits(compiles, { T t; t.dispose(); });
}
void using (alias block, T)(T t) if (isDisposable!(T))
{
block(t);
scope (exit)
t.dispose();
}
void using (string block, T)(T t) if (isDisposable!(T))
{
with (t)
mixin(block);
scope (exit)
t.dispose();
}
class Foo
{
void bar ()
{
writeln("bar");
}
void dispose ()
{
writeln("dispose");
}
}
void main ()
{
using!(foo => foo.bar())(new Foo);
using!q{ bar(); }(new Foo);
}
If D could have a better syntax for delegates/blocks, it could look like
this:
using(new Foo ; foo) {
foo.bar();
}
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list