What’s the deal with the C# “using” construct?


We spent a little bit of time today talking about the “using” construct and potential problems and confusion that people have been having with it.  For those who don’t know, the “using” statement is a simple C# construct that provides concise syntax for a very common pattern.  Specifically, the C# language specification says that it will convert code with the following structure:


using ( expression )
statement

into


ExpressionType temp = expression;
try {
statement
} finally {
if (temp != null) {
((IDisposable)temp).Dispose();
}
}

This allows you to concisely work with a resource that needs to be disposed in a timely fashion.  A good example of this are things like file handles.  There are a limited number that the OS can give out, and it’s quite possible to run out of them if you haphazardly request them and then depend on the garbage collector to clean them up for you.  Now, in a perfect world, the GC would be aware of non-memory resources and it would reclaim things like handles when they were no longer being used by you.  However, in today’s world that’s not how things work so the “using” construct can be used in conjunction with the IDisposable interface pattern to accomplish that.


Now, we could have not introduced the “using” construct, however without it code tends to get incredibly messy.  Consider if you are using two disposable resources, the code then becomes:


ExpressionType1 temp1 = expression1;
try {
ExpressionType temp2 = expression2;
try {
statement
} finally {
if (temp2 != null) {
((IDisposable)temp2).Dispose();
}
}
} finally {
if (temp1 != null) {
((IDisposable)temp1).Dispose();
}
}

Bleagh!  That’s pretty awful.  With “using” you can write that as:


using (ExpressionType1 name1 = expression1, name2 = expression2)
statement

or, alternatively


using (expression1)
using (expression2)
statement

(personally, I prefer the latter).  That’s a heck of a lot more concise and far easier to grok.


So, what’s the problem that people have been having with the “using” construct?  Well, as you may have already noticed there’s a potential problem whereby a resource you’ve acquired is not released in a timely manner.  When can that happen?  Well consider the following:


ExpressionType temp = expression;
//asynchronous exception (like ThreadAbortException) is thrown now
try {
statement
} finally {
if (temp != null) {
((IDisposable)temp).Dispose();
}
}

Uh-oh.  We have a problem.  You’ve acquired the resource in “expression”, but before entering the “try” some asynchronous exception occurs and so the resource is never disposed.  At first glance it seems like there is a trivial fix for this.  Simply change the code transformation so that it generates:


ExpressionType temp = null;
try {
temp = expression;
statement
} finally {
if (temp != null) {
((IDisposable)temp).Dispose();
}
}

Terrific right?  Now if an asynchronous exception occurs after “expression” is invoked, we’ll be inside the “try” and so the “finally” block will execute and clean up the resource for us.   Unfortunately, that’s still not the case!  How so?  Well consider the following:


ExpressionType temp = null;
try {
temp = /*async-exception thrown before assignment occurs*/ expression;
statement
} finally {
if (temp != null) {
((IDisposable)temp).Dispose();
}
}

Sigh…  The resource has been acquired, but when the “finally” runs “temp” will still be null, and nothing will get disposed at that time.


OMG!  The sky is falling!  The sky is falling!


Seems like you’re in a horrible position here right!?  How on earth will you know if your resources are going to be cleaned up?  Are we now in a world where you’re going to be leaking resources and you’re not going to be able to trust your managed code?


Fortunately, no, things are not as dire as they seem.  Why?  Well, first let’s start with an assumption.  If you are writing code that follows the .Net guidelines, and you listen to tools like FxCop, then you’re going to be writing your classes that implement IDisposable as recommended in the MSDN documentation.


What this means is that even if you forget, or fail (because of an asynchronous exception), to explicitly call “Dispose” on the resource it will be ok because the GC will eventually finalize your object which will end up doing the same. 


But wait a minute.  Didn’t I just say that depending on the GC to clean up critical resources was a bad practice since you might run out of resources before the GC kicks in?  Yes I did.  However, the difference here is that if you have the bad luck to run into this asynchronous exception problem you stand the chance of not disposing at most a couple of disposable objects.  And the chance of those few objects causing you to be unable to acquire any more resources is exceedingly slim.  Contrast that with code that just does something like this:


while (true) {
AcquireResource();
}

In this case you’re going to be leaking tons and tons of resources and it will very quickly become a problem for you.  In the asynchronous case you will be leaking a worst a couple of resources, and they will almost certainly be reclaimed before they could ever be a problem.


It should also be noted that these asynchronous exceptions occur in extremely bad situations (like a thread dying).  And, in native code, it’s often extremely difficult to recover from this at all.  The managed world allows you to have a good balance.  When an error occurs you may leak a resource, but even so it will quickly be reclaimed soon afterwards. 


So if you’ve ever seen the transformation done by the C# compiler and wondered why it did what it did, well now you know. 


Any thoughts or questions on this stuff?


Comments (21)

  1. Wesner Moise says:

    The one problem that I have for using "using" is the lack of support for transactions.

    When code goes out of a using block, there is no way to know if it was from an abnormal termination (exception) or a normal exit. If this were known, the Dispose() call could perform a commit or rollback as needed.

    The System.Transaction guys have a ITransaction interface that derives IDisposable and includes a Rollback method–or something like that. If "Using" were to recognize the ITransaction pattern then it could actually do the right thing, rather than assume abnormal termination is normal.

  2. CyrusN says:

    Wesner: I haven’t given it a lot of thought, but why can’t you have:

    class Transaction : IDisposable {

    …bool committed = false;

    …void Commit() {

    ……committed = true;

    …}

    …void Dispose() {

    ……if (!committed) {

    ………Abort();

    ……}

    …}

    }

    then you can do this:

    using (Transaction t = …) {

    …//do some stuff

    …//and, if everything goes right

    …t.Commit();

    }

    ?

  3. Frans Bouma says:

    There is another problem with using:

    using (IDataAccessAdapter adapter = DataAccessAdapterFactory.Create("SqlServer"))

    {

    //…

    }

    My factory produces DataAccessAdapter instances, for the type of db passed in. Great. Now, it throws an exception, because it can’t cast IDataAccessAdapter to IDisposable. Though, the object returned from Create is implementing IDisposable.

    So, instead of using the interface, I have to use the base class, which implements IDataAccessAdapter and IDisposable. However, this isn’t obvious. I.o.w.: the compiler should already throw an error in the using line that ‘IDataAccessAdapter’ doesn’t derive from IDisposable and therefore can’t be used in a using expression.

  4. zz says:

    You know what would be great? How about having a using statement that automatically thethers to the local scope like C++/CLI stack based declaration. This avoids having to have nested braces that requires another level of indentation. Here’s what I mean:

    void foo( x, y )

    {

    // Auto-disposes at the end of function

    // no extra braces require

    using ( ExpressionType1 temp1 = expression1, ExpressionType2 temp2 = expression2 );

    // Some code…

    }

    OR

    void bar( x, y )

    {

    // Some code

    // Nested block

    if ( expr )

    {

    // auto-disposes at the end of the block

    using( ExpressionType1 temp1 = expression1 );

    using( ExpressionType2 temp2 = expression2 );

    //…

    }

    // …

    // end

    }

  5. Nice post.

    The same problem applies to the ‘lock’ statement, only in this case the JIT compiler has a way of catering for it. This is explained in detail by Ian Griffiths here

    http://www.interact-sw.co.uk/iangblog/2005/04/12/jitlockhack

    which is a follow-up to Joe Duffy’s excellent article which can be found here

    http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641

  6. Darren Oakey says:

    We use using heaps – as it _almost_ gives you a concept similar to anyonymous methods.

    One thing that’s always annoyed me, and it’s more about exception handling than using, but we run up against it every day – there should be a way you can ask in a finally block "did an exception occur"

    For example – we do use using for transactions. So we have

    using (Ambient transaction block = AmbientTransaction.Called("Update prices"))

    {



    block.Commit();

    }

    and we do the obvious stuff in the dispose.

    What really annoys me, and I’ve tried every weird thing I can think of, is I can’t do what I really want to do and say "a transaction is committed if an exception doesn’t occur". I really want to write:

    using (AmbientTransaction.Called("Update Prices"))

    {



    }

    And it really bothers me that (as far as I can tell) it can’t be done.

  7. Sean M says:

    public struct SafeDatabaseHandle : IDisposable

    {

    private IDbConnection connection;

    public SafeDatabaseHandle(IDbConnection connection)

    {

    this.connection = connection;

    this.connection.Open();

    }

    public SafeDatabaseHandle(IDbCommand command) : this(command.Connection)

    {

    }

    public void Dispose()

    {

    this.connection.Close();

    }

    }

    SqlCommand cmd = new SqlCommand("UPDATE BLAH", conn);

    using (new SafeDatabaseHandle(cmd))

    {

    cmd.ExecuteNonQuery();

    }

  8. Sean M says:

    Woops, forgot to actually write:

    I use the above code as a way of closing DB connections. Keeps a lot of DB code clean and succinct.

  9. Joe Duffy says:

    I cover this in fair detail in my article http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641, which I was happy to notice somebody already linked to!

    This is a problem we really want to solve in Orcas. I noted a couple possible solutions at the bottom of the article. I had a few other speculations, but after conversations w/ Chris Brumme, I realized most of them were crap and we’d never recommend people write their code that way (nevermind have C# spit the code).

    For example,

    ExpressionType temp = null;

    try {

    try {}

    finally { temp = /*async-exception gets held up if triggered here*/ expression; }

    /* …and actually throws here */

    statement

    } finally {

    if (temp != null) {

    ((IDisposable)temp).Dispose();

    }

    }

    will ensure that an async exception won’t get raised, since we hold off on processing them during finally block execution. We also don’t execute them while you’re in a CER, running some opaque unmanaged code, and a few other corner scenarios. But holding up an async abort is a pretty rude thing to do, especially if you intend to block inside of it.

    Further, you could imagine a class like

    static class ReliableFactory

    {

    public static void New<T>(out T created)

    where T : new()

    {

    try {}

    finally { created = new T(); }

    }

    }

    which would enable you to write

    ExpressionType temp = null;

    try {

    ReliableFactory.New<ExpressionType>(out temp);

    /* similar to above, an async exception won’t prevent the out assignment to temp */

    statement

    } finally {

    if (temp != null) {

    ((IDisposable)temp).Dispose();

    }

    }

    But this is fairly hokey.

    I really hope we solve this problem in Orcas. But there’s quite a bit to do with Dispose that needs a fixin’, too. :)

  10. kukuxz says:

    [url=http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/]网站建设[/url]

    [url=http://www.51jipiao.net/]机票[/url]

    [url=http://www.51jipiao.net/chanshi.html]飞机票[/url]

    [url=http://www.51jipiao.net/guoji.asp]国际机票[/url]

    [url=http://www.51jipiao.net/guonei.asp]打折机票[/url]

    [url=http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/]网站设计[/url]

    [url=http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/]网站制作[/url]

    [url=http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/]网页设计[/url]

    [url=http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/“>http://www.ocnwave.net/]网页制作[/url]

    [url=http://app1.chinadaily.com.cn/static/cdyw/]翻译公司[/url]

    [url=http://www.webcc.cn/]虚拟主机[/url]

    [url=http://www.ocntrans.com/]翻译公司[/url]

    [url=http://www.18up.cn/indexsex.asp]成人用品[/url]

    [url=http://www.scstar.net/]移民[/url]

    [url=http://www.sh-dingyi.net/]减速机[/url]

    [url=http://lhc001.blogsky.com/]六合彩[/url]

    [url=http://kydn.s7.xrea.com/index1.htm]免费成人电影[/url]

    [url=http://kydn.s7.xrea.com/index2.htm]免费激情电影[/url]

    [url=http://kydn.s7.xrea.com/index3.htm]免费色情电影[/url]

    [url=http://kydn.s7.xrea.com/index4.htm]免费性交电影[/url]

    [url=http://kydn.s7.xrea.com/index5.htm]免费黄色电影[/url]

    [url=http://jipiao365.diy.myrice.com/index1.html]免费成人电影[/url]

    [url=http://jipiao365.diy.myrice.com/index2.html]免费激情电影[/url]

    [url=http://jipiao365.diy.myrice.com/index3.html]免费色情电影[/url]

    [url=http://jipiao365.diy.myrice.com/index4.html]免费黄色电影[/url]

    [url=http://jipiao365.diy.myrice.com/index5.html]免费性交电影[/url]

    [url=http://jrfygs.nease.net/]翻译公司[/url]

    [url=http://www.farsight.com.cn/“>http://www.farsight.com.cn/]嵌入式培训[/url]

    [url=http://www.farsight.com.cn/“>http://www.farsight.com.cn/]嵌入式[/url]

    [url=http://ruxian.home4u.china.com/]乳腺增生[/url]

    [url=http://carolamber.home4u.china.com/]琥珀[/url]

    [url=http://www.jplm.cn/jipiao/]机票[/url]

    [url=http://www.jplm.cn/dazhe/]打折机票[/url]

    [url=http://www.jplm.cn/tejia/]特价机票[/url]

    [url=http://www.jplm.cn/guoji/]国际机票[/url]

    [url=http://www.jplm.cn/fjp/]飞机票[/url]

    [url=http://www.bzdcg.com/]担保[/url]

    [url=http://www.bjjds.com/]新风换气机[/url]

    [url=http://hualang.home4u.china.com/]画廊[/url]

    [url=http://hualang.home4u.china.com/index1.html]画框[/url]

    [url=http://www.cdxinlilai.com/]三面翻[/url]

    [url=http://www.kly88.cn/]癫痫[/url]

    [url=http://www.youanlivertx.com/]肝移植[/url]

    [url=http://www.bjgelin.com/]儿童摄影[/url]

    [url=http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm]北京印章[/url]

    [url=http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm]刻章[/url]

    [url=http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm“>http://www.hdkz.com.cn/index1.htm”>http://www.hdkz.com.cn/index1.htm]北京刻章[/url]

    [url=http://www.hdkz.com.cn/]印章[/url]

    [url=http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25″>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25“>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25″>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25]白塞氏[/url]

    [url=http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25″>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25“>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25″>http://www.hmkouqiang.com/article/Article_Show.asp?ArticleID=25]白塞氏综合症[/url]

    [url=http://www.hmkouqiang.com/article/Article_Class2.asp?ClassID=2″>http://www.hmkouqiang.com/article/Article_Class2.asp?ClassID=2]白塞氏病[/url]

    [url=http://www.hmkouqiang.com/]口腔溃疡[/url]

    [url=http://www.hmkouqiang.com/article/Article_Class2.asp?ClassID=3]口腔扁平苔藓[/url]

    [url=http://www.hmkouqiang.com/article/Article_Class2.asp?ClassID=3]扁平苔藓[/url]

    [url=http://www.zidianbing.com/]紫癜[/url]

    [url=http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/]服装批发[/url]

    [url=http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/]瑞丽服装批发[/url]

    [url=http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/]日韩服装批发[/url]

    [url=http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/“>http://www.taobao168.com/]珠宝首饰批发[/url]

    [url=http://www.bjygmd.com/]木雕[/url]

    [url=http://www.lvsemayi.com/]软水机[/url]

    [url=http://www.d9com.com/“>http://www.d9com.com/]小说[/url]

    [url=http://www.d9com.com/“>http://www.d9com.com/]玄幻小说[/url]

    [url=http://huiminyy.home4u.china.com/index1.htm]过敏性紫癜[/url]

    [url=http://huiminyy.home4u.china.com/index2.htm]血小板减少[/url]

    [url=http://huiminyy.home4u.china.com/index.htm]复发性口腔溃疡[/url]

    [url=http://jrfygs.nease.net/index1.htm]汽车翻译[/url]

    [url=http://jrfygs.nease.net/index2.htm]法律翻译[/url]

    [url=http://jrfygs.nease.net/index3.htm]金融翻译[/url]

    [url=http://jrfygs.nease.net/index4.htm]网站翻译[/url]

    [url=http://jrfygs.nease.net/index5.htm]德文翻译[/url]

    [url=http://jrfygs.nease.net/index6.htm]法文翻译[/url]

    [url=http://jrfygs.nease.net/index7.htm]日文翻译[/url]

    [url=http://jrfygs.nease.net/index8.htm]法语翻译[/url]

    [url=http://jrfygs.nease.net/index9.htm]日语翻译[/url]

    [url=http://jrfygs.nease.net/index10.htm]英语翻译[/url]

    [url=http://jrfygs.nease.net/index11.htm]英文翻译[/url]

    [url=http://jrfygs.nease.net/index12.htm]韩语翻译[/url]

    [url=http://jrfygs.nease.net/index13.htm]翻译网站[/url]

    [url=http://jrfygs.nease.net/index14.htm]中英文翻译[/url]

    [url=http://jrfygs.nease.net/index15.htm]英文翻译中文[/url]

    [url=http://jrfygs.nease.net/index16.htm]中文翻译英文[/url]

    [url=http://jrfygs.nease.net/index17.htm]翻译服务[/url]

    [url=http://jrfygs.nease.net/index18.htm]北京翻译[/url]

    [url=http://jrfygs.nease.net/index19.htm]北京翻译公司[/url]

    [url=http://jrfygs.nease.net/index20.htm]专业翻译[/url]

    [url=http://www.jplm.cn/jipiao/beijing/]北京机票[/url]

    [url=http://www.jplm.cn/jipiao/shanghai/]上海机票[/url]

    [url=http://www.jplm.cn/jipiao/guangzhou/]广州机票[/url]

    [url=http://www.jplm.cn/jipiao/chengdu/]成都机票[/url]

    [url=http://www.jplm.cn/jipiao/kunming/]昆明机票[/url]

    [url=http://www.jplm.cn/jipiao/shenyang/]沈阳机票[/url]

    [url=http://www.jplm.cn/jipiao/xian/]西安机票[/url]

    [url=http://www.jplm.cn/jipiao/hangzhou/]杭州机票[/url]

    [url=http://www.jplm.cn/jipiao/chongqing/]重庆机票[/url]

    [url=http://www.jplm.cn/jipiao/nanjing/]南京机票[/url]

    [url=http://www.jplm.cn/jipiao/xiamen/]厦门机票[/url]

    [url=http://www.jplm.cn/jipiao/qingdao/]青岛机票[/url]

    [url=http://www.jplm.cn/jipiao/wuhan/]武汉机票[/url]

    [url=http://www.jplm.cn/jipiao/shenzhen/]深圳机票[/url]

    [url=http://www.jplm.cn/dazhe/beijing/]北京打折机票[/url]

    [url=http://www.jplm.cn/dazhe/shanghai/]上海打折机票[/url]

    [url=http://www.jplm.cn/dazhe/guangzhou/]广州打折机票[/url]

    [url=http://www.jplm.cn/dazhe/chengdu]成都打折机票[/url]

    [url=http://www.jplm.cn/dazhe/kunming/]昆明打折机票[/url]

    [url=http://www.jplm.cn/dazhe/shenyang/]沈阳打折机票[/url]

    [url=http://www.jplm.cn/dazhe/xian/]西安打折机票[/url]

    [url=http://www.jplm.cn/dazhe/hangzhou/]杭州打折机票[/url]

    [url=Reply

  • 动平衡仪 says:

    <font size="5" face="黑体"><strong> <a href="http://www.emt.com.cn“>http://www.emt.com.cn“>http://www.emt.com.cn“>http://www.emt.com.cn">动平衡仪</a>”>http://www.emt.com.cn“>http://www.emt.com.cn“>http://www.emt.com.cn“>http://www.emt.com.cn">动平衡仪</a> <a href="http://www.aobsoft.com">速达</a>”>http://www.aobsoft.com">速达</a> <a href="http://www.atlus.com.cn“>http://www.atlus.com.cn">贴纸相机</a>”>http://www.atlus.com.cn“>http://www.atlus.com.cn">贴纸相机</a> <a href="http://www.tcaccp.com">北大青鸟</a>”>http://www.tcaccp.com">北大青鸟</a> <a href="http://www.mhsho.com">保洁</a>”>http://www.mhsho.com">保洁</a> <a href="http://www.ectraining.cn“>http://www.ectraining.cn">电脑培训</a>”>http://www.ectraining.cn“>http://www.ectraining.cn">电脑培训</a> <a href="http://www.ectraining.cn“>http://www.ectraining.cn">计算机培训</a>”>http://www.ectraining.cn“>http://www.ectraining.cn">计算机培训</a> <a href="http://www.mdjkehai.com">无功补偿</a>”>http://www.mdjkehai.com">无功补偿</a> <a href="http://beauty.xicn.net">图片</a>”>http://beauty.xicn.net">图片</a> <a href="http://joke.xicn.net">笑话</a>”>http://joke.xicn.net">笑话</a> <a href="http://www.ctranslation.com“>http://www.ctranslation.com">translation</a>”>http://www.ctranslation.com“>http://www.ctranslation.com">translation</a> <a href="http://www.ctranslation.com“>http://www.ctranslation.com">chinese”>http://www.ctranslation.com“>http://www.ctranslation.com">chinese translation</a> <a href="http://www.bl1688.com“>http://www.bl1688.com">工艺品</a>”>http://www.bl1688.com“>http://www.bl1688.com">工艺品</a> <a href="http://www.bl1688.com“>http://www.bl1688.com">礼品</a>”>http://www.bl1688.com“>http://www.bl1688.com">礼品</a> <a href="http://www.nbzone.com.cn">ibm笔记本</a>”>http://www.nbzone.com.cn">ibm笔记本</a> <a href="http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn">”>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn">红外测温仪</a>”>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn">”>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn">红外测温仪</a> <a href="http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn">”>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>http://www.df18.com.cn“>

  • fff says:

    [url=http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>http://www.88tm.com/“>

  • http://mfdyyy.zj.com/zp.htm

    http://mfdyyy.zj.com/crxs.htm

    http://mfdyyy.zj.com/hsxs.htm

    http://mfdyyy.zj.com/index01.htm

    http://mfdyyy.zj.com/index02.htm

    http://mfdyyy.zj.com/index03.htm

    http://mfdyyy.zj.com/index05.htm

    http://mfdyyy.zj.com/index06.htm

    http://mfdyyy.zj.com/index07.htm

    http://mfdyyy.zj.com/index08.htm

    http://mfdyyy.zj.com/index09.htm

    http://mfdyyy.zj.com/index10.htm

    http://mfdyyy.zj.com/index11.htm

    http://mfdyyy.zj.com/index12.htm

    http://mfdyyy.zj.com/index13.htm

    http://mfdyyy.zj.com/index15.htm

    http://mfdyyy.zj.com/jqdy.htm

    http://mfdyyy.zj.com/kddy.htm

    http://mfdyyy.zj.com/kdy.htm

    http://mfdyyy.zj.com/kdyy.htm

    http://mfdyyy.zj.com/mfdy.htm

    http://mfdyyy.zj.com/mfyy.htm

    http://mfdyyy.zj.com/mxxz.htm

    http://mfdyyy.zj.com/nx.htm

    http://mfdyyy.zj.com/rtxz.htm

    http://mfdyyy.zj.com/rtys.htm

    http://mfdyyy.zj.com/sjdy.htm

    http://mfdyyy.zj.com/sjp.htm

    http://mfdyyy.zj.com/sqxs.htm

    http://mfdyyy.zj.com/swdy.htm

    http://mfdyyy.zj.com/xdy.htm

    http://mfdyyy.zj.com/xsh.htm

    http://mfdyyy.zj.com/xzdy.htm

    http://mfdyyy.zj.com/xzmfdy.htm

    http://mfdyyy.zj.com/yqdy.htm

    http://mfdyyy.zj.com/tt.htm

    http://mfdyyy.zj.com/xz.htm

    http://mfdyyy.zj.com/lt.htm

    http://mfdyyy.zj.com/mv.htm

    http://mfdyyy.zj.com/splt.htm

    http://mfdyyy.zj.com/qqsplt.htm

    http://mfdyyy.zj.com/tj.htm

    http://mfdyyy.zj.com/hj.htm

    http://mfdyyy.zj.com/jy.htm

    http://mfdyyy.zj.com/mmo.htm

    http://mfdyyy.zj.com/mx.htm

    http://mfdyyy.zj.com/sk.htm

    http://mfdyyy.zj.com/hp.htm

    网站越办越好

    http://mfdyy8.blogsky.com

    http://rtyss8.blogsky.com

    http://spltt8.blogsky.com

    http://wyzpp8.blogsky.com

    http://crdyy8.blogsky.com

    http://crdyy88.blogsky.com

    http://crltt8.blogsky.com

    http://crxss8.blogsky.com

    http://hsdyy8.blogsky.com

    http://sqdyy8.blogsky.com

    http://mfhsdya8.blogsky.com

    http://mfcrdya8.blogsky.com

    http://mfsqdya8.blogsky.com

    http://crxssso.ebloggy.com

    http://crltttan.ebloggy.com

    http://crdyyy.ebloggy.com

    http://hsdyy8.ebloggy.com

    http://sqdyyy8i.ebloggy.com

    http://crtppp8.ebloggy.com

    http://mfdyy888.ebloggy.com

    http://wyzpp.ebloggy.com

    http://rtysu888.ebloggy.com

    http://my520.ebloggy.com

    http://xdyyy.ebloggy.com

    http://splttt88.ebloggy.com

    http://crdyyyaa.ebloggy.com

    http://crltttaaa8.ebloggy.com

    http://meinv1233.blogsky.com

    http://mfdy168.blogsky.com

    http://qijianmianfei.yculblog.com

    http://meinvxiez.mblogger.cn

    http://chengrltt.ebloggy.com

    http://chengrendiany.ebloggy.com

    http://chengrenxiaosuo.ebloggy.com

    http://xiaodiany.yculblog.com

    http://shipingliaotian.ebloggy.com

    http://mvvvv123.yculblog.com

    http://spltty88.yculblog.com

    http://rtysss88.yculblog.com

    http://wyzppp8.yculblog.com