0

我有以下代码:

        try
        {
            using (var context = new DataContext())
            {
                if (!context.Database.Exists())
                {
                    // Create the SimpleMembership database without Entity Framework migration schema
                    ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                }
            }


            WebSecurity.InitializeDatabaseConnection("xxx", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            var sql = System.IO.File.ReadAllText("SqlScript.sql");
            context.Database.ExecuteSqlCommand(sql);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }

有人可以解释“使用”的目的是什么吗?

4

5 回答 5

3

它是正确处理模式的语法糖

它相当于

DataContext context = new DataContext();
try
{
   // using context here
}
finally
{
  if(context != null)
    ((IDisposable)context).Dispose();
}

这在 MSDN 文章中针对using Statement.

using这种方式使用可确保适当的一次性使用并减少程序员出错的机会。

于 2013-03-10T13:58:04.420 回答
1

using使用后自动处置对象。您无需手动调用.Dispose().

using (var context = new DataContext())
{
    // other codes
}  
// at this point the context is already disposed

是相同的

var context = new DataContext()
// other codes
context.Dispose()    // manually calling Dispose()
// at this point the context is already disposed
于 2013-03-10T13:58:02.330 回答
0

using语句确保Dispose在 using 块结束时调用它。您的代码相当于:

var context = new DataContext();

try
{ 
   if (!context.Database.Exists())
   {
       ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
   }
}
finally
{
    if (context != null)
        context.Dispose();
}
于 2013-03-10T13:57:51.690 回答
0

"using"语句的原因是确保对象始终disposed正确,并且不需要显式代码来确保发生这种情况。

using语句简化了您必须编写的代码来创建并最终清理对象。

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

相当于:

MyResource myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    // Check for a null resource.
    if (myRes!= null)
        // Call the object's Dispose method.
        ((IDisposable)myRes).Dispose();
}
于 2013-03-10T13:59:18.767 回答
0

该关键字using用于实现IDisposable接口的对象 - 如果对象被垃圾收集器收集,它们包含不会被清除的非托管资源。
使用时,using您将对象的范围限制为花括号,并且当using-Statement 离开时,所有非托管资源都将被释放。

在这里看到这篇文章。

于 2013-03-10T13:59:47.260 回答