什么是C#指针和什么类型的任务需要他们?

问题描述:

我以前从未见过这一点 - 在C#中指针:什么是C#指针和什么类型的任务需要他们?

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string> { 
    public String(char* value); // <-- string has a constructor that takes a char pointer? 
... 
} 

我很想得到一点点的了解。

是一个char指针,就像C/C++中的一个指针,即一个与存储位置大小相同的int值?

我也怀疑我的理解指针缺乏是为什么我从来没有完全掌握ref关键字的功能,换句话说它们是相关的吗?

+0

你应该学习什么指针在'C'。这完全一样。和'ref'部分:只读** MSDN **,或尝试使用一次。 – gdoron 2012-04-15 00:48:03

+0

他们是内存位置 - int值足够的字节来表示进程地址空间中的任何位置,不是? – 2012-04-15 00:49:56

+0

@gdoron,是的,我发现MSDN是一个赌博 - 有时它很清楚,因为白天我很高兴我去了那里,其他时间我希望我只是把它放在*,让一个谁可以在睡梦中回答它它对我来说简洁明了......这就是为什么这是一个很受欢迎的地方吧? – 2012-04-15 00:51:49

根据我的理解,指针用于性能优化,您可以在此处打入“不安全”的字段,并直接操作内存地址。

以我的经验,图像处理的是,你从指针显著效益的地区之一,像

http://imrannazar.com/Using-Pointers-in-C

Unsafe Pointer iteration and Bitmap - why is UInt64 faster?

必须有其他典型的场景,而是一个普通的C#应用​​程序一般来讲不需要指针。

Pointer types是C#语言的一部分。它们的工作方式与C中的指针类似,并允许您使用非托管内存,并使用blittable类型和blittable类型的数组。它们与ref/out参数无关(这些使用托管指针,这是不同的事情)。由于如果使用不正确,使用指针可能会破坏类型安全性,因此只能在unsafe上下文中使用它们。

C#旨在简化内存管理,为程序员提供更快,更简单的编程方式。这是以牺牲性能(和懒惰编程)为代价的,垃圾处理必须通过并杀死所有破坏的指针。例如,在一个游戏更新循环这个创造了很多的东西,对于垃圾处理收集:

 Vector3 myVector; 
     void update(int x, int y, int z) 
     { 
      myVector = new Vector3(x, y, x); //This will kill your Xbox 360 with enough objects 
     } 

在C#中的一切保持作为参考。这与C/C++稍有不同,程序员在RAM中引用数据时有不同的方式。

作为一种为程序员提供更灵活的方法,尤其是在需要高性能的领域,程序员可以使用指针和引用。这被称为“不安全”变量,因为它不再由垃圾处理管理。换句话说,如果存在内存泄漏,垃圾处理将不会到来并将其删除。

另一个原因是为了C#/ C++之间的兼容性。如果您在两种语言之间插入代码,您很快就会意识到C#需要知道如何为C++端传递和获取的指针提供兼容性。所以说,如果我想通过C++代码的指针,我通过

someInterpatedFunc(ref myVariable); 

希望这能回答一些问题:)

+0

谢谢,这很有帮助! – 2012-04-15 05:28:36