using 和try/catch區別和注意點


書上解釋:

using: 
在C#和其他托管語言中,沒有自動、決定性的析構方式,而是有一個垃圾收集器,它會在未來的某個時刻釋放資源。它是非決定性的,因為我們不能確定這個過程在什么時候發生。忘記關閉數據庫連接可能會導致.NET可執行程序的各種問題。我們使用using子句確保實現IDisposable接口的對象在退出塊時立即被釋放。 

try和catch是配對使用的,一般用來捕捉異常。

 

 

如:

using(Sqlconnection con = new SqlConnection()) 

  //代碼執行塊 


using 的簡單的理解:括號里定義的con只在using{}這對括號內有效,出了后就沒用了

 

 

區別實例:

 

 using 語句確保調用 Dispose,即使在調用對象上的方法時發生異常也是如此。通過將對象放入 try 塊中,並在調用 finally 塊中的 Dispose,可以獲得相同的結果;

如:
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }

多個對象與可以用 using 語句,但必須在 using 語句中聲明這些對象

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}



tips:

1:寫程序的時候知道錯誤是什么,就用if,不建議使用try catch!

2:using會保證非托管的資源在離開using作用域的時候刪除。

3:close()和dispose()區別

 

 

   C#中析構函數是有垃圾搜集器來調用的,當所引用的堆上的數據當無效時,會隱式調用。一般表現為當引用變量超出其作用域時就會調用。   
  Close函數和Dispose函數則是一種約定。調用Close函數釋放資源后可能還需要再次使用,而Dispose函數釋放的資源不再使用。   
  另外,如果類實現了IDisposable接口,實例化類時可以使用using關鍵字,則當超出using關鍵字作用域時會隱式調用Dispose函數 。

 4:using的幾種用法【轉】

 

1.using指令。using + 命名空間名字,這樣可以在程序中直接用命令空間中的類型,而不必指定類型的詳細命名空間,類似於Java的import,這個功能也是最常用的,幾乎每個cs的程序都會用到。
例如:using System; 一般都會出現在*.cs中。

2.using別名。using + 別名 = 包括詳細命名空間信息的具體的類型。
這種做法有個好處就是當同一個cs引用了兩個不同的命名空間,但兩個命名空間都包括了一個相同名字的類型的時候。當需要用到這個類型的時候,就每個地方都要用詳細命名空間的辦法來區分這些相同名字的類型。而用別名的方法會更簡潔,用到哪個類就給哪個類做別名聲明就可以了。注意:並不是說兩個名字重復,給其中一個用了別名,另外一個就不需要用別名了,如果兩個都要使用,則兩個都需要用using來定義別名的。

 

 

復制代碼
using System;
using aClass = NameSpace1.MyClass;
using bClass = NameSpace2.MyClass;

namespace NameSpace1 
{
    public class MyClass 
    {
        public override string ToString() 
        {
            return "You are in NameSpace1.MyClass";
        }
    }
}

namespace NameSpace2 
{
    class MyClass 
    {
        public override string ToString() 
        {
            return "You are in NameSpace2.MyClass";
        }
    }
}

namespace testUsing
{
    using NameSpace1;
    using NameSpace2;
    /// <summary>
    /// Class1 的摘要說明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此處添加代碼以啟動應用程序
            //
            
            aClass my1 = new aClass();            
            Console.WriteLine(my1);
            bClass my2 = new bClass();
            Console.WriteLine(my2);
            Console.WriteLine("Press any key");
            Console.Read();
        }
    }
}
復制代碼

 

3.using語句,定義一個范圍,在范圍結束時處理對象。
場景:
當在某個代碼段中使用了類的實例,而希望無論因為什么原因,只要離開了這個代碼段就自動調用這個類實例的Dispose。
要達到這樣的目的,用try...catch來捕捉異常也是可以的,但用using也很方便。
例如:

 

using (Class1 cls1 = new Class1(), cls2 = new Class1())
{
  // the code using cls1, cls2


} // call the Dispose on cls1 and cls2

 

這里觸發cls1和cls2的Dispose條件是到達using語句末尾或者中途引發了異常並且控制離開了語句塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM