2013-02-13 111 views
-4

我想在处理完该功能后再处理该实例。东西与“使用”我认为...一旦完成后如何处置

也 我想将每个名称添加到数组。

我尝试:

 using( Database db = new Database()) 

    public string[] FindNameByLength(int minimumCharNumber) 
    { 

     try{ 
     var query = from u in db.Users 
        where u.FullName.Length > minimumCharNumber 
        select u.FullName; 


     string[] namesLength; 
     int counter; 

     foreach (var s in query) 
     { 
      namesLength.Concat(new[] {s }); 
     } 
     return namesLength; 
     } 
     finally IDisposable(db).dispose(); 
    } 

} 
+0

它是什么,你要处理的? – 2013-02-13 14:23:28

+0

你想要处置什么?你的代码不会编译。 – 2013-02-13 14:23:44

+0

数据库db =新数据库() – darko 2013-02-13 14:23:58

回答

1

请参阅using Statement:提供了一种方便的语法,可确保正确使用IDisposable对象。

通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)也会在调用Dispose后立即使对象本身超出范围。在使用块中,对象是只读的,不能被修改或重新分配。

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。将对象放在try块中,然后在finally块中调用Dispose,可以获得相同的结果;实际上,这是编译器如何翻译using语句。

所以,要么使用使用块

using (Database db = new Database()) 
{ 

} 

或者,你可以使用试,终于

Database db = new Database(); 
    try 
    { 

    } 
    finally 
    { 
    if (db != null) 
     ((IDisposable)db).Dispose(); 
    } 
6

using(...) 
{ 
    ... 
} 

自己的函数中。也不要明确地呼叫Dispose

public string[] FindNameByLength(int minimumCharNumber) 
{ 
    using (Database db = new Database()) 
    { 
     var query = from u in db.Users 
        where u.FullName.Length > minimumCharNumber 
        select u.FullName; 

     string[] namesLength; 
     int counter; 

     foreach (var s in query) 
     { 
      namesLength.Concat(new[] { s }); 
     } 

     return namesLength; 
    } 
} 

Finally也没有必要在这里,因为Dispose将永远被调用,不管你怎么退出using范围(return,例外,})。

+0

但请记住在使用结束之前关闭与数据库的连接。像db.Close()之类的东西 - 或者连接将保持打开状态,并且对象不会被丢弃。 – KBoek 2013-02-13 14:26:25

+1

@KBoek实际上,当调用Dispose()时,大多数数据库连接类型对象的实现在内部调用Close()。我们并不确切知道'Database'是什么,但可能很适合上述情况。 – 2013-02-13 14:28:12

+1

@KBoek基于LINQ语法,我假设'Database'代表一个实体框架上下文。处理上下文做所有必需的东西(关闭连接到数据库等) – ken2k 2013-02-13 14:29:10

相关问题