成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C#固定的和活動的變量

開發 后端
本文介紹C#固定的和活動的變量,以及介紹在不安全上下文中,一個表達式的值可以來自于一個指針類型;但是在上下文之外,會造成編譯時期錯誤。

C#固定的和活動的變量

&和fixed將變量分為兩類:C#固定的和活動的變量。

固定的變量***的存在并不會被GC的操作影響。(例如局部變量,值參數和間接指針)活動的變量會被GC重新分配位置或是釋放(例如對象中的字段,基礎數據數組)。

&取固定變量的地址是沒有限制的。但是活動變量容易受GC的影響,其地址只能通過fixed來獲得,并且地址僅會在整個fixed語句的周期持續有效。

靜態字段也是活動變量。還有標記為ref或out的也是活動變量,即使這個參數是傳遞給固定參數的。***,通過間接指針引用的變量總是固定變量。

指針轉換

在不安全上下文中,下面的轉換是隱式的:
◆從任何指針類型到void*
◆從null到任何指針類型

除此之外,下面的轉換都是顯式的:
◆從任何指針類型到另外的指針類型
◆從sbyte, byte, short, ushort, int, uint, long, or ulong到其他類型
◆從任何類型到sbyte, byte, short, ushort, int, uint, long, or ulong

指針轉換并不改變指針的值。也就是說指針轉換前后不影響地址的值。

當轉換發生后,當結果指針沒有按照正確的指針類型排列的話,當訪問結果時結果是無法預知的。

下面的例子:

  1. char c = 'A';  
  2. char* pc = &c;  
  3. void* pv = pc;  
  4. int* pi = (int*)pv;  
  5. int i = *pi;  
  6. // undefined  
  7. *pi = 123456;  
  8. // undefined 

下面的例子會打印出double的8字節的值:

  1. usingSystem;  
  2. classTest  
  3. {  
  4. unsafestaticvoidMain(){  
  5. doubled=123.456e23;  
  6. unsafe{  
  7. byte*pb=(byte*)&d;  
  8. for(inti=0;i<sizeof(double);++i)  
  9. Console.Write("{0:X2}",*pb++);  
  10. Console.WriteLine();  
  11. }  
  12. }  

打印結果取決于endian.

指針數組

在不安全上下文中,是允許指針數組的,只有幾種用于其轉換是允許的:
◆從任何數組類型到System.Array或是實現了其接口的隱式引用類型轉換同樣適用于指針數組。但是,任何試圖通過System.Array或是實現了其接口訪問數組元素都會引發一個 運行時錯誤,因為指針類型不能轉化為object.
◆從一個一維數組類型S[]到System.Collections.Generic.IList<T>或是到其基接口,任何顯示或是隱式的轉換都是不行的。因為指針類型不能被用作類型參數,還有沒有從指針類型到非指針類型的轉換。
◆從System.Array或是實現了其接口到任何數組類型顯示引用轉換適用于指針數組。
◆從System.Collections.Generic.IList<T>或是到其基接口到一個一維數組類型T[],任何顯示的轉換都是不行的。原因同上面第2條。

還有就是對于foreach語句,不適用于指針數組。相反,下面的語句

foreach (V v in x) embedded-statement

中的x是一個數組類型T[,,…,],n是數組的維度減1,T和V是指針類型,被改寫為:

  1. {  
  2. T[,,…,]a=x;  
  3. Vv;  
  4. for(inti0=a.GetLowerBound(0);i0<=a.GetUpperBound(0);i0++)  
  5. for(inti1=a.GetLowerBound(1);i1<=a.GetUpperBound(1);i1++)  
  6. …  
  7. for(intin=a.GetLowerBound(n);in<=a.GetUpperBound(n);in++){  
  8. v=(V)a.GetValue(i0,i1,…,in);  
  9. embedded-statement  
  10. }  

變量a,i0,i1,…對于x或者embedded-statement或者其余部分的代碼是不可見的或是不可訪問的。變量v在embedded-statement中是只讀的。如果沒有顯示轉換從T到V,那么就會有錯誤。如果x是個null,就會有空引用異常。

表達式中的指針

在不安全上下文中,一個表達式的值可以來自于一個指針類型;但是在上下文之外,會造成編譯時期錯誤。

間接訪問

一元的*表示一個指針,被用來獲得指針指向的值。*用在void*類型表達式或是非指針類型表達式時,會造成編譯期錯誤。

*被用在null指針時是由實現來決定的。不能保證在使用時會拋出System.NullReferenceException.

如果一個非法的值賦給指針,那么*的行為是不可預知的。

指針成員訪問

在指針成員訪問P->I中,P必須是除了void*之外的類型,I同時必須是一個可訪問的成員。

P->I效果上相同于(*P)。I.例如:

  1. usingSystem;  
  2. structPoint  
  3. {  
  4. publicintx;  
  5. publicinty;  
  6. publicoverridestringToString(){  
  7. return"("+x+","+y+")";  
  8. }  
  9. }  
  10. classTest  
  11. {  
  12. staticvoidMain(){  
  13. Pointpoint;  
  14. unsafe{  
  15. Point*p=&point;  
  16. p->x=10;  
  17. p->y=20;  
  18. Console.WriteLine(p->ToString());  
  19. }  
  20. }  

或是

  1. classTest  
  2. {  
  3. staticvoidMain(){  
  4. Pointpoint;  
  5. unsafe{  
  6. Point*p=&point;  
  7. (*p).x=10;  
  8. (*p).y=20;  
  9. Console.WriteLine((*p).ToString());  
  10. }  
  11. }  

指針元素訪問

在指針元素訪問P[E]中,P必須是除了void*之外的類型,同時E必須能隱式的轉換為int, uint, long, or ulong的表達式。

P[E]效果上同*(P + E)。例如:

  1. classTest  
  2. {  
  3. staticvoidMain(){  
  4. unsafe{  
  5. char*p=stackallocchar[256];  
  6. for(inti=0;i<256;i++)p[i]=(char)i;  
  7. }  
  8. }  
  9. }  
  10. 又如:  
  11. classTest  
  12. {  
  13. staticvoidMain(){  
  14. unsafe{  
  15. char*p=stackallocchar[256];  
  16. for(inti=0;i<256;i++)*(p+i)=(char)i;  
  17. }  
  18. }  

以上介紹C#固定的和活動的變量

【編輯推薦】

  1. C#調用Windows API函數
  2. 詳解C#調用Outlook API
  3. C#連接Access、SQL Server數據庫
  4. 介紹C#調用API的問題
  5. C#調用Excel與附加代碼
責任編輯:佚名 來源: IT168
相關推薦

2009-08-13 15:03:58

C#結構體變量

2009-09-04 17:34:11

C#CC++

2009-08-11 13:13:09

C#和Java比較

2009-08-03 15:06:43

C# Stack對象C# Queue對象

2009-08-18 09:06:41

C#對象和集合

2009-08-26 14:27:03

C# Framewor

2009-08-14 10:51:43

2009-09-17 17:13:54

C#數組

2009-08-10 10:04:25

C#抽象類C#接口

2009-08-21 10:28:21

C#異步方法C#同步方法

2009-08-11 10:12:21

2009-06-24 10:25:25

C#泛型

2009-09-02 17:07:06

C#數組操作

2009-09-03 17:51:34

C#獲取設備的ID

2009-07-31 13:48:34

C# eval()函數

2009-08-24 14:43:35

C# 泛型

2009-02-05 15:32:23

接口委托

2009-08-20 18:30:33

C# ReaderWr

2011-09-21 10:56:31

C#結構

2009-08-26 10:34:15

C#類型C#變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产一区 | 欧美日韩专区 | 欧美日韩中文字幕在线播放 | 日韩毛片在线视频 | 久久久久久女 | 老司机精品福利视频 | 在线观看亚洲专区 | 日韩在线观看视频一区 | 91精品久久久 | 一区二区三区高清不卡 | av天天操 | 国产黄色大片在线免费观看 | 天天爱av | www..99re| 久久精品国产一区二区电影 | 天天视频一区二区三区 | 国产成人免费视频网站视频社区 | 毛片黄片免费看 | 欧美视频在线观看 | 性视频一区 | 亚洲一区二区三区视频 | 91在线免费视频 | 中文字幕视频在线 | 国产精品成人免费 | 欧美区精品 | 欧美精品一二区 | 做a视频在线观看 | wwww.xxxx免费 | 在线只有精品 | 国产成人在线一区 | 国产精品一区二区三区四区 | 国产成人99久久亚洲综合精品 | 欧美13videosex性极品 | 欧美日韩久久 | 美女久久久久久久久 | 精品国产一区二区三区久久久蜜月 | 黑人巨大精品欧美一区二区免费 | 97超碰人人 | 成人在线视频一区 | 亚洲欧美综合精品久久成人 | 久久99精品国产 |