91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-09-13 16:23:42 來源:億速云 閱讀:144 作者:chen 欄目:編程語言

這篇文章主要介紹“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

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

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

下面的例子:

char c = 'A';  char* pc = &c;  void* pv = pc;  int* pi = (int*)pv;  int i = *pi;  // undefined  *pi = 123456;  // undefined

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

usingSystem;  classTest  {  unsafestaticvoidMain(){  doubled=123.456e23;  unsafe{  byte*pb=(byte*)&d;  for(inti=0;i<sizeof(double);++i)  Console.Write("{0:X2}",*pb++);  Console.WriteLine();  }  }  }

打印結果取決于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是指針類型,被改寫為:

{  T[,,…,]a=x;  Vv;  for(inti0=a.GetLowerBound(0);i0<=a.GetUpperBound(0);i0++)  for(inti1=a.GetLowerBound(1);i1<=a.GetUpperBound(1);i1++)  …  for(intin=a.GetLowerBound(n);in<=a.GetUpperBound(n);in++){  v=(V)a.GetValue(i0,i1,…,in);  embedded-statement  }  }

變量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.例如:

usingSystem;  structPoint  {  publicintx;  publicinty;  publicoverridestringToString(){  return"("+x+","+y+")";  }  }  classTest  {  staticvoidMain(){  Pointpoint;  unsafe{  Point*p=&point;  p->x=10;  p->y=20;  Console.WriteLine(p->ToString());  }  }  }

或是

classTest  {  staticvoidMain(){  Pointpoint;  unsafe{  Point*p=&point;  (*p).x=10;  (*p).y=20;  Console.WriteLine((*p).ToString());  }  }  }

指針元素訪問

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

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

classTest  {  staticvoidMain(){  unsafe{  char*p=stackallocchar[256];  for(inti=0;i<256;i++)p[i]=(char)i;  }  }  }  又如:  classTest  {  staticvoidMain(){  unsafe{  char*p=stackallocchar[256];  for(inti=0;i<256;i++)*(p+i)=(char)i;  }  }  }

到此,關于“C#中的固定和活動變量介紹”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旺苍县| 普格县| 台安县| 金塔县| 康保县| 霍州市| 鄂托克旗| 阳曲县| 长宁区| 万年县| 镶黄旗| 特克斯县| 璧山县| 福鼎市| 南投县| 邓州市| 黔江区| 山阴县| 鸡东县| 马山县| 文安县| 徐州市| 资源县| 若尔盖县| 奉贤区| 靖江市| 大冶市| 夹江县| 隆昌县| 松潘县| 衡东县| 临颍县| 鄢陵县| 炎陵县| 新沂市| 海安县| 介休市| 延津县| 宜君县| 广丰县| 陕西省|