1. 程式人生 > >C#中using和new的用法

C#中using和new的用法

using

根據微軟MSDN上的解釋,c#中的using共有三種用途:引用名稱空間、為名稱空間或型別建立別名、使用using語句。

1、引用名稱空間

用using來引用名稱空間,可以直接在程式中使用名稱空間下的型別而不必指定詳細的名稱空間,如:using System.ServiceModel等等。

2、為名稱空間或型別建立別名

當一個類引用了不同的名稱空間,但這些名稱空間都包括了一個相同名字的型別時,可以使用using關鍵字來建立別名,這樣會使程式碼更簡潔。注意:並不是說兩個型別名字重複,給其中一個使用了別名,另外一個就不需要用別名了,如果兩個型別都要在該類中使用,則兩個都需要用using來定義別名

,如下:

  1. //名稱空間MyApplication中包含一個類MyClass
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace MyApplication
  6. {
  7. publicclass MyClass
  8. {
  9. publicint Order = 1;
  10. }
  11. }
  12. //名稱空間OtherApplication中也包含一個類MyClass
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Text;
  16. namespace
    OtherApplication
  17. {
  18. publicclass MyClass
  19. {
  20. publicint Number = 1;
  21. }
  22. }
  23. //在程式中使用using為兩個相同名字的型別定義別名
  24. using System;
  25. using System.Collections.Generic;
  26. using System.Text;
  27. using ClassA = MyApplication.MyClass;
  28. using ClassB = OtherApplication.MyClass;
  29. namespace UsingTest
  30. {
  31. class Program
  32. {
  33. staticvoid Main(string[] args)
  34. {
  35. ClassA ca = new ClassA();
  36. ca.Order = 1;
  37. ClassB cb = new ClassB();
  38. cb.Number = 2;
  39. Console.WriteLine(ca.Order.ToString());
  40. Console.WriteLine(cb.Number.ToString());
  41. }
  42. }
  43. }

3、使用using語句,定義一個範圍,在範圍結束時清理物件。(注意:該物件必須實現了IDisposable介面)。其功能和try-->catch-->finally完全相同。如:

  1. string strCon = "Data Source=.;Initial Catalog=WCFPT;uid=sa;pwd=sa";
  2. using (SqlConnection sqlCon = new SqlConnection(strCon))
  3. {
  4. sqlCon.Open();
  5. }

注:這裡SqlConnection預設實現了IDisposable介面,如果是自己寫的類,那就要自己動手來實現IDisposable介面。

使用using語句需要注意的幾點:

(1)物件必須實現IDisposable介面,否則編譯器會報錯誤,如:

  1. //不能被編譯
  2. using (string strMsg="Test")
  3. {
  4. Console.WriteLine(strMsg);
  5. }

(2)using物件檢查是靜態型別檢查,並不支援執行時型別檢查,因此如下錯誤也會出現編譯錯誤:

  1. string strCon = "Data Source=.;Initial Catalog=WCFPT;uid=sa;pwd=sa";
  2. SqlConnection sqlCon = new SqlConnection(strCon);
  3. object objCon = sqlCon;
  4. //不能被編譯
  5. using (objCon)
  6. {
  7. Console.WriteLine(objCon.ToString());
  8. }

但是可以通過“as”進行型別轉換的方式來改進,如下:

  1. string strCon = "Data Source=.;Initial Catalog=WCFPT;uid=sa;pwd=sa";
  2. SqlConnection sqlCon = new SqlConnection(strCon);
  3. object objCon = sqlCon;
  4. //可以被編譯
  5. using (objCon as IDisposable)
  6. {
  7. Console.WriteLine(objCon.ToString());
  8. }

(3)當同時需要釋放多個資源時,並且物件型別不同,可以這樣寫:

  1. string strCon = "Data Source=.;Initial Catalog=WCFPT;uid=sa;pwd=sa";
  2. string strCmd = "delete from t_Employee";
  3. using (SqlConnection sqlCon = new SqlConnection(strCon))
  4. using (SqlCommand sqlCmd = new SqlCommand(strCmd, sqlCon))
  5. {
  6. sqlCon.Open();
  7. sqlCmd.ExecuteNonQuery();
  8. sqlCon.Close();
  9. }

如果物件型別相同,可以寫到一起:

  1. using (Font MyFont1 =new Font("Arial",10.0f),MyFont2 = new Font("Arial",10.0f))
  2. {
  3. //do something
  4. }

(4)using關鍵字只是針對C#語句,對於VB等其他語言還沒有對應的功能。

new

new的幾種用法有:new運算子(用於建立物件和呼叫建構函式)、new修飾符(用於隱藏基類成員的繼承成員)、new約束(用於在泛型宣告中約束可能用作型別引數的引數的型別)等。

1、new運算子

(1)用於建立物件和呼叫建構函式,如:

MyClass classA=new MyClass();

(2)用於為值型別呼叫預設的建構函式,如:

int myInt=new int();

myInt初始化為0,它是int型別的預設值。該語句的效果等同於:int myInt=0;

(3)、不能過載new運算子。

(4)、如果new運算子分配記憶體失敗,則它將引發OutOfMemoryException異常。

2、new修飾符

使用new修飾符可以顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中宣告該成員。