c中using的用法
c中using的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c中using的用法的用法,希望對你們有用。
c中using的用法的用法如下:
using 關鍵字有兩個主要用途:
?作爲指令,用於爲命名空間創建別名或導入其他命名空間中定義的類型。請參見 using 指令。
?作爲語句,用於定義一個範圍,在此範圍的末尾將釋放對象。請參見 using 語句。
好了我們看到了MSDN給了我們答案,其中using只要有兩種用法一種是指令、另一種是語句。
那我們從指令開始吧,而在MSDN中指令又有兩種用法
1.允許在命名空間中使用類型,這樣,您就不必在該命名空間中限定某個類型的使用:
using ;
2爲命名空間或類型創建別名。
using Project = ect;
(1.1)第一種我們在熟悉不過了,但是你知道vs的編譯過程嗎。當我們創建一個控制檯應用程序,系統爲我們生成了很多個默認的using空間。
例如:
1 using System;
2 using ric;
3 using ;
4 using ;
但是當我們寫一個hello world 程序的時候,真正用到的只有using System這個空間。可能你會說那我們引用這麼多空間幹嘛,不會佔用資源嗎?這裏我來告訴你答案。雖然我們引用了很多多餘的空間但是我們的vs卻幫我們在內存中引用了它需要的那些。當然從我們角度看,有沒有辦法去掉那些我們不需要的命名空間呢?這裏我告訴你一種辦法。當我們做好整個項目的時候我們在using的區域內右擊-----組織using------移除和排序,這樣就可以去掉那些不需要的了。
(1.2)爲命名空間或類型創建別名。這個用到的不是很多,但是講到了那我們就詳細點。當我們在一個命名空間內調用一個類的時候,沒有有問題的。但是當我們調用在兩個不同的命名空間內的相同名字的類名時,這時你是否想到辦法呢。這就是別名的用處了,我們給兩個空間分別取個別名,然後別名.類名,這樣不是分開他們了嗎。
using別名例子
運行結果:
You are in ass
(2)using (Font font3 = new Font("Arial", 10.0f),font4 = new Font("Arial", 10.0f))
首先Font 是訪問非託管資源(本例中爲文件句柄和設備上下文)的託管類型的示例。有許多其他類別的非託管資源和封裝這些資源的類庫類型。所有這些類型都必須實現 IDisposable 接口。
按照規則,當使用 IDisposable 對象時,應在 using 語句中聲明和實例化此對象。using 語句按照正確的方式調用對象上的 Dispose 方法,並(在您按照前面所示方式使用它時)會導致在調用 Dispose 時對象自身處於範圍之外。在 using 塊中,對象是隻讀的並且無法進行修改或重新分配。
using 語句確保調用 Dispose,即使在調用對象上的方法時發生異常也是如此。通過將對象放入 try 塊中,並在調用 finally 塊中的 Dispose,可以獲得相同的結果;實際上,這就是編譯器轉換 using 語句的方式。前面的代碼示例在編譯時將擴展到以下代碼(請注意,使用額外的大括號爲對象創建有限範圍):
這句你理解了嗎?那我們從IL代碼看看using語句的實質。
複製代碼
1 od private hidebysig static void Main(string[] args) cil managed
2 {
3 ypoint
4 // 代碼大小 80 (0x50)
5 tack 3
6 ls init ([0] class [ing] font3,
7 [1] class [ing] font4,
8 [2] bool CS$4$0000)
9 IL_0000: nop
10 IL_0001: ldstr "Arial"
11 IL_0006: ldc.r4 10.
12 IL_000b: newobj instance void [ing]::(string,
13 float32)
14 IL_0010: stloc.0
15
16 {
17 IL_0011: ldstr "Arial"
18 IL_0016: ldc.r4 10.
19 IL_001b: newobj instance void [ing]::(string,
20 float32)
21 IL_0020: stloc.1
22
23 {
24 IL_0021: nop
25 IL_0022: nop
26 IL_0023: leave.s IL_0035
27 } // end
28 finally
29 {
30 IL_0025: ldloc.1
31 IL_0026: ldnull
32 IL_0027: ceq
33 IL_0029: stloc.2
34 IL_002a: ldloc.2
35 IL_002b: brtrue.s IL_0034
36 IL_002d: ldloc.1
37 IL_002e: callvirt instance void [mscorlib]posable::Dispose()
38 IL_0033: nop
39 IL_0034: endfinally
40 } // end handler
41 IL_0035: nop
42 IL_0036: leave.s IL_0048
43 } // end
44 finally
45 {
46 IL_0038: ldloc.0
47 IL_0039: ldnull
48 IL_003a: ceq
49 IL_003c: stloc.2
50 IL_003d: ldloc.2
51 IL_003e: brtrue.s IL_0047
52 IL_0040: ldloc.0
53 IL_0041: callvirt instance void [mscorlib]posable::Dispose()
54 IL_0046: nop
55 IL_0047: endfinally
56 } // end handler
57 IL_0048: nop
58 IL_0049: call valuetype [mscorlib]oleKeyInfo [mscorlib]ole::ReadKey()
59 IL_004e: pop
60 IL_004f: ret
61 } // end of method Program::Main
複製代碼
可以看到其實using對應的是try、finally來處理。
所有上面的句子等同於
複製代碼
1 Font font3 = new Font("Arial", 10.0f);
2 try
3 {
4 Font font4 = new Font("Arial", 10.0f);
5 try
6 {
7 }
8 finally
9 {
10 if (font4 != null)
11 ((IDisposable)font4)ose();
12 }
13 }
14 finally
15 {
16 if (font3 != null)
17 ((IDisposable)font3)ose();
18 }
複製代碼
雖然using語句使用很簡單,但是還是需要有幾點注意的地方。
ose方法用於清理對象封裝的非託管資源,而不是釋放對象的內存,對象的內存永遠有垃圾回收器控制。
2.程序在達到using語句末尾時退出using塊,而如果到達語句末尾之前引入異常則有可能提前退出。
g中初始化的對象,可以在using語句之前聲明。
如:
Font font3 = new Font("Arial", 10.0f);
Using(font3){
}
4.要使用的類必須實現IDisposable接口。