學習啦 > 學習英語 > 專業(yè)英語 > 計算機英語 > c中using的用法

c中using的用法

時間: 長思709 分享

c中using的用法

  c中using的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c中using的用法的用法,希望對你們有用。

  c中using的用法的用法如下:

  using 關鍵字有兩個主要用途:

  ?作為指令,用于為命名空間創(chuàng)建別名或導入其他命名空間中定義的類型。請參見 using 指令。

  ?作為語句,用于定義一個范圍,在此范圍的末尾將釋放對象。請參見 using 語句。

  好了我們看到了MSDN給了我們答案,其中using只要有兩種用法一種是指令、另一種是語句。

  那我們從指令開始吧,而在MSDN中指令又有兩種用法

  1.允許在命名空間中使用類型,這樣,您就不必在該命名空間中限定某個類型的使用:

  using System.Text;

  2為命名空間或類型創(chuàng)建別名。

  using Project = PC.MyCompany.Project;

 ?。?.1)第一種我們在熟悉不過了,但是你知道vs的編譯過程嗎。當我們創(chuàng)建一個控制臺應用程序,系統(tǒng)為我們生成了很多個默認的using空間。

  例如:

  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  但是當我們寫一個hello world 程序的時候,真正用到的只有using System這個空間。可能你會說那我們引用這么多空間干嘛,不會占用資源嗎?這里我來告訴你答案。雖然我們引用了很多多余的空間但是我們的vs卻幫我們在內(nèi)存中引用了它需要的那些。當然從我們角度看,有沒有辦法去掉那些我們不需要的命名空間呢?這里我告訴你一種辦法。當我們做好整個項目的時候我們在using的區(qū)域內(nèi)右擊-----組織using------移除和排序,這樣就可以去掉那些不需要的了。

  (1.2)為命名空間或類型創(chuàng)建別名。這個用到的不是很多,但是講到了那我們就詳細點。當我們在一個命名空間內(nèi)調(diào)用一個類的時候,沒有有問題的。但是當我們調(diào)用在兩個不同的命名空間內(nèi)的相同名字的類名時,這時你是否想到辦法呢。這就是別名的用處了,我們給兩個空間分別取個別名,然后別名.類名,這樣不是分開他們了嗎。

  using別名例子

  運行結果:

  You are in NameSpace1.MyClass

 ?。?)using (Font font3 = new Font("Arial", 10.0f),font4 = new Font("Arial", 10.0f))

  首先Font 是訪問非托管資源(本例中為文件句柄和設備上下文)的托管類型的示例。有許多其他類別的非托管資源和封裝這些資源的類庫類型。所有這些類型都必須實現(xiàn) IDisposable 接口。

  按照規(guī)則,當使用 IDisposable 對象時,應在 using 語句中聲明和實例化此對象。using 語句按照正確的方式調(diào)用對象上的 Dispose 方法,并(在您按照前面所示方式使用它時)會導致在調(diào)用 Dispose 時對象自身處于范圍之外。在 using 塊中,對象是只讀的并且無法進行修改或重新分配。

  using 語句確保調(diào)用 Dispose,即使在調(diào)用對象上的方法時發(fā)生異常也是如此。通過將對象放入 try 塊中,并在調(diào)用 finally 塊中的 Dispose,可以獲得相同的結果;實際上,這就是編譯器轉換 using 語句的方式。前面的代碼示例在編譯時將擴展到以下代碼(請注意,使用額外的大括號為對象創(chuàng)建有限范圍):

  這句你理解了嗎?那我們從IL代碼看看using語句的實質。

  復制代碼

  1 .method private hidebysig static void Main(string[] args) cil managed

  2 {

  3 .entrypoint

  4 // 代碼大小 80 (0x50)

  5 .maxstack 3

  6 .locals init ([0] class [System.Drawing]System.Drawing.Font font3,

  7 [1] class [System.Drawing]System.Drawing.Font font4,

  8 [2] bool CS

c中using的用法

時間: 長思709 分享

c中using的用法

  c中using的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c中using的用法的用法,希望對你們有用。

  c中using的用法的用法如下:

  using 關鍵字有兩個主要用途:

  ?作為指令,用于為命名空間創(chuàng)建別名或導入其他命名空間中定義的類型。請參見 using 指令。

  ?作為語句,用于定義一個范圍,在此范圍的末尾將釋放對象。請參見 using 語句。

  好了我們看到了MSDN給了我們答案,其中using只要有兩種用法一種是指令、另一種是語句。

  那我們從指令開始吧,而在MSDN中指令又有兩種用法

  1.允許在命名空間中使用類型,這樣,您就不必在該命名空間中限定某個類型的使用:

  using System.Text;

  2為命名空間或類型創(chuàng)建別名。

  using Project = PC.MyCompany.Project;

  (1.1)第一種我們在熟悉不過了,但是你知道vs的編譯過程嗎。當我們創(chuàng)建一個控制臺應用程序,系統(tǒng)為我們生成了很多個默認的using空間。

  例如:

  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  但是當我們寫一個hello world 程序的時候,真正用到的只有using System這個空間。可能你會說那我們引用這么多空間干嘛,不會占用資源嗎?這里我來告訴你答案。雖然我們引用了很多多余的空間但是我們的vs卻幫我們在內(nèi)存中引用了它需要的那些。當然從我們角度看,有沒有辦法去掉那些我們不需要的命名空間呢?這里我告訴你一種辦法。當我們做好整個項目的時候我們在using的區(qū)域內(nèi)右擊-----組織using------移除和排序,這樣就可以去掉那些不需要的了。

 ?。?.2)為命名空間或類型創(chuàng)建別名。這個用到的不是很多,但是講到了那我們就詳細點。當我們在一個命名空間內(nèi)調(diào)用一個類的時候,沒有有問題的。但是當我們調(diào)用在兩個不同的命名空間內(nèi)的相同名字的類名時,這時你是否想到辦法呢。這就是別名的用處了,我們給兩個空間分別取個別名,然后別名.類名,這樣不是分開他們了嗎。

  using別名例子

  運行結果:

  You are in NameSpace1.MyClass

  (2)using (Font font3 = new Font("Arial", 10.0f),font4 = new Font("Arial", 10.0f))

  首先Font 是訪問非托管資源(本例中為文件句柄和設備上下文)的托管類型的示例。有許多其他類別的非托管資源和封裝這些資源的類庫類型。所有這些類型都必須實現(xiàn) IDisposable 接口。

  按照規(guī)則,當使用 IDisposable 對象時,應在 using 語句中聲明和實例化此對象。using 語句按照正確的方式調(diào)用對象上的 Dispose 方法,并(在您按照前面所示方式使用它時)會導致在調(diào)用 Dispose 時對象自身處于范圍之外。在 using 塊中,對象是只讀的并且無法進行修改或重新分配。

  using 語句確保調(diào)用 Dispose,即使在調(diào)用對象上的方法時發(fā)生異常也是如此。通過將對象放入 try 塊中,并在調(diào)用 finally 塊中的 Dispose,可以獲得相同的結果;實際上,這就是編譯器轉換 using 語句的方式。前面的代碼示例在編譯時將擴展到以下代碼(請注意,使用額外的大括號為對象創(chuàng)建有限范圍):

  這句你理解了嗎?那我們從IL代碼看看using語句的實質。

  復制代碼

  1 .method private hidebysig static void  Main(string[] args) cil managed

  2 {

  3   .entrypoint

  4   // 代碼大小       80 (0x50)

  5   .maxstack  3

  6   .locals init ([0] class [System.Drawing]System.Drawing.Font font3,

  7            [1] class [System.Drawing]System.Drawing.Font 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 [System.Drawing]System.Drawing.Font::.ctor(string,

  13                                                                                 float32)

  14   IL_0010:  stloc.0

  15   .try

  16   {

  17     IL_0011:  ldstr      "Arial"

  18     IL_0016:  ldc.r4     10.

  19     IL_001b:  newobj     instance void [System.Drawing]System.Drawing.Font::.ctor(string,

  20                                                                                   float32)

  21     IL_0020:  stloc.1

  22     .try

  23     {

  24       IL_0021:  nop

  25       IL_0022:  nop

  26       IL_0023:  leave.s    IL_0035

  27     }  // end .try

  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]System.IDisposable::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 .try

  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]System.IDisposable::Dispose()

  54     IL_0046:  nop

  55     IL_0047:  endfinally

  56   }  // end handler

  57   IL_0048:  nop

  58   IL_0049:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::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).Dispose();

  12                 }

  13             }

  14             finally

  15             {

  16                 if (font3 != null)

  17                     ((IDisposable)font3).Dispose();

  18             }

  復制代碼

  雖然using語句使用很簡單,但是還是需要有幾點注意的地方。

  1.Dispose方法用于清理對象封裝的非托管資源,而不是釋放對象的內(nèi)存,對象的內(nèi)存永遠有垃圾回收器控制。

  2.程序在達到using語句末尾時退出using塊,而如果到達語句末尾之前引入異常則有可能提前退出。

  3.Using中初始化的對象,可以在using語句之前聲明。

  如:

  Font font3 = new Font("Arial", 10.0f);

  Using(font3){

  }

  4.要使用的類必須實現(xiàn)IDisposable接口。

00)

  9 IL_0000: nop

  10 IL_0001: ldstr "Arial"

  11 IL_0006: ldc.r4 10.

  12 IL_000b: newobj instance void [System.Drawing]System.Drawing.Font::.ctor(string,

  13 float32)

  14 IL_0010: stloc.0

  15 .try

  16 {

  17 IL_0011: ldstr "Arial"

  18 IL_0016: ldc.r4 10.

  19 IL_001b: newobj instance void [System.Drawing]System.Drawing.Font::.ctor(string,

  20 float32)

  21 IL_0020: stloc.1

  22 .try

  23 {

  24 IL_0021: nop

  25 IL_0022: nop

  26 IL_0023: leave.s IL_0035

  27 } // end .try

  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]System.IDisposable::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 .try

  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]System.IDisposable::Dispose()

  54 IL_0046: nop

  55 IL_0047: endfinally

  56 } // end handler

  57 IL_0048: nop

  58 IL_0049: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::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).Dispose();

  12 }

  13 }

  14 finally

  15 {

  16 if (font3 != null)

  17 ((IDisposable)font3).Dispose();

  18 }

  復制代碼

  雖然using語句使用很簡單,但是還是需要有幾點注意的地方。

  1.Dispose方法用于清理對象封裝的非托管資源,而不是釋放對象的內(nèi)存,對象的內(nèi)存永遠有垃圾回收器控制。

  2.程序在達到using語句末尾時退出using塊,而如果到達語句末尾之前引入異常則有可能提前退出。

  3.Using中初始化的對象,可以在using語句之前聲明。

  如:

  Font font3 = new Font("Arial", 10.0f);

  Using(font3){

  }

  4.要使用的類必須實現(xiàn)IDisposable接口。

熱門文章

542997