什么是c#指针以及哪些任务需要它们?

时间:2012-04-15 00:45:54

标签: c# pointers

我从未在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关键字的作用,换句话说它们是否相关?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

在我的理解中,指针用于性能优化,在这里您可以进入“不安全”领域,并直接操作内存地址。

根据我的经验,图像处理是你从指针中获得显着好处的领域之一,比如

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

Unsafe Pointer iteration and Bitmap - why is UInt64 faster?

必须有其他典型的场景,但普通的C#应用​​程序通常不需要指针。

答案 2 :(得分:1)

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);

希望回答一些问题:)