自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分析C#不安全代碼

開發(fā) 后端
本文介紹C#不安全代碼,C#是.Net平臺上主流的開發(fā)語言,和經(jīng)典的C/C++不同的是,C#所編寫的代碼是托管代碼,由GC來管理內(nèi)存,省去了new/delete的煩惱。

C#是.Net平臺上主流的開發(fā)語言,和經(jīng)典的C/C++不同的是,C#所編寫的代碼是托管代碼,由GC來管理內(nèi)存,省去了new/delete的煩惱。但是,由于某些特殊的要求,比如和底層的操作系統(tǒng)接口,訪問內(nèi)存映射設(shè)備或者實現(xiàn)對時間要求苛刻的算法時,提供了C#不安全代碼。

不安全上下文

C#不安全代碼只能寫在不安全上下文中。

通過unsafe 修飾符可以修飾:
class, struct, interface, or delegate
field, method, property, event, indexer, operator, instance constructor, destructor, or static constructor
unsafe-statement-block

指針的類型

在不安全上下文中,指針類型和引用類型或是值類型一樣。但是,指針類型可以用在不安全上下文之外的typeof中,雖然這么做不安全。

Type t = typeof(Int32*);返回的是System.Int32*
pointer-type:
unmanaged-type
void
unmanaged-type:
type

非托管類型不是引用類型,也不包含任何嵌套的引用類型的成員。

非托管類型就是下面的一種:
◆sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool.
◆Any enum-type.
◆Any pointer-type.
◆Any user-defined struct-type that contains fields of unmanaged-types only.

和C/C++不同的是,聲明多個指針變量需要:

int *p1,*p2;

但是在C#中,int* p1,p2就聲明了兩個指針變量,并且*是在類型之后,不是在變量名之前。

和引用類型相同的是,指針可以為null(所有位為0),如果訪問一個指向null的指針會引發(fā)不可預(yù)知的結(jié)果。

Void* 表示一個指針指向未知類型。因為指向未知類型,所以不能通過*來訪為指向的變量,也不能對指針進(jìn)行數(shù)學(xué)運算。但是,void*可以轉(zhuǎn)換為任何指針類型,反之亦然。

指針類型是一個單獨的類型。指針類型不是繼承自System.Object,,并且兩者也不能互相轉(zhuǎn)換。同樣裝箱和拆箱也不適合指針類型。但是不同類型指針之間可以互相轉(zhuǎn)換。

指針類型不能用于類型參數(shù),當(dāng)泛型方法的類型參數(shù)為指針類型會調(diào)用失敗。

指針類型還可用于易變字段類型。

雖然指針還能通過ref和out來傳遞,但是會造成不可預(yù)知的行為,當(dāng)指針指向一個已經(jīng)不存在的本地變量,或是指向一個實際不再固定的固定對象。比如:

  1. usingSystem;  
  2.  
  3. classTest  
  4. {  
  5. staticintvalue=20;  
  6.  
  7. unsafestaticvoidF(outint*pi1,refint*pi2){  
  8. inti=10;  
  9. pi1=&i;  
  10.  
  11. fixed(int*pj=&value){  
  12. //...  
  13. pi2=pj;  
  14. }  
  15. }  
  16.  
  17. staticvoidMain(){  
  18. inti=10;  
  19. unsafe{  
  20. int*px1;  
  21. int*px2=&i;  
  22.  
  23. F(outpx1,refpx2);  
  24.  
  25. Console.WriteLine("*px1={0},*px2={1}",  
  26. *px1,*px2);//undefinedbehavior  
  27. }  
  28. }  
  29. }  

方法可以返回指針類型。

  1. unsafestaticint*Find(int*pi,intsize,intvalue){  
  2. for(inti=0;i<size;++i){  
  3. if(*pi==value)  
  4. returnpi;  
  5. ++pi;  
  6. }  
  7. returnnull;  

主要有幾個操作符:
◆ *被用作間接訪問
◆ ->被用作通過指針來訪為結(jié)構(gòu)的成員
◆ []用來做指針的索引器
◆ &用來獲得變量的地址
◆ ++和—用來自增和自減指針
◆ +和-用來做指針的算術(shù)運算
◆ ==, !=, <, >, <=, and =>用來比較指針
◆ stackalloc可以從棧上分配內(nèi)存
◆fixed用來臨時固定一個變量,所以它的地址總是可以得到的。以上介紹C#不安全代碼

【編輯推薦】

  1. C#調(diào)用Windows API函數(shù)
  2. 詳解C#調(diào)用Outlook API
  3. C#連接Access、SQL Server數(shù)據(jù)庫
  4. 介紹C#調(diào)用API的問題
  5. C#調(diào)用Excel與附加代碼
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2015-07-01 14:48:51

2014-04-15 15:35:32

CC語言

2012-04-16 10:12:54

Java線程

2020-04-22 20:35:02

HashMap線程安全

2023-06-01 19:24:16

2021-04-04 23:16:52

安全刷臉銀行

2020-11-03 12:32:25

影子物聯(lián)網(wǎng)物聯(lián)網(wǎng)IOT

2024-01-19 08:42:45

Java線程字符串

2014-04-09 09:37:29

2014-09-12 17:44:23

2009-11-12 08:38:34

2010-08-16 10:01:01

2021-12-08 07:31:40

Linux安全病毒

2009-11-18 10:05:13

2015-12-10 15:07:15

2024-03-04 08:45:37

C#空引用異常Nothing

2015-05-27 16:13:05

2017-02-16 08:50:00

2021-04-12 10:38:51

CC++谷歌

2012-11-14 09:54:14

點贊
收藏

51CTO技術(shù)棧公眾號