C#为什么不推荐使用指针?

简述

    为了保持类型安全性,默认情况下,C#不支持指针算法。C#的托管内存管理提供一套安全管理对象的平台,更高级的语言就意味着更全面的封装。指针不是安全类型,用完后你需要自己释放分配的内存,如果不注意很容易内存泄漏的。

    当然,如果你是高级程序员,有需要通过操作指针来操作内存,这样可以提高程序效率,不怕麻烦可以使用,我们可以用C#中的unsafe关键字修饰含有指针操作的程序段。.

class Program
{
  static int Main(string[] args)
  {

      unsafe
      {
          // ...
      }
  }
}

unsafe只是编译器指令语法,只是在编译的时候起作用,并不是说unsafe修饰的程序段是unmanaged,他们仍然是managed的。

考点

    主要考察C#语言设计的初衷,c#托管内存管理就是跟你提供一套安全管理对象的平台,不用考虑内存释放的问题,提高程序员的学习成本和工作效率。

使用方式

在C#里定义指针和C++有些不同:

1. C#指针定义的星号只能和类型在一起

     int* p1, p2;    //p1和p2都是int*指针

     而在C++中与之等价的定义是:

     int *p1, *p2;  //C++

     int *p1, p2;   //C++中,p2只是一个普通的int

2. C#指针类型不能是引用类型,不能是含有引用类型的自定义类型或复合类型,只能是预定义类型

    string* pMessage    //错误C#指针定义

    struct ServiceStatus
    {
      int State;
      string Description;  // 引用类型   

    }

    ServiceStatus* pStatus   //错误指针定义

3. C#中指针赋值

    在C#里,引用类型也叫Movable类型,由于垃圾回收器和内存布局优化,在堆上分配的内存是不固定的,会被挪动。所不   

    能将堆上分配的地址赋值给C#指针, 如果能将堆上地址固定,就没有问题了,那么如何固定引用类型?C#中有一个关键字 

    fixed可以用在此处。

    byte* pData = &bytes[0];  // 编译错误,数组在C#里是引用类型,属于movable

    byte[] bytes = new byte[24];
    fixed (byte* pData = &bytes)   //正确,使用fixed固定
    {
       // ...
    }

    当然,使用fixed不是没有代价的,它会使内存出现碎片。