我从未在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 :(得分: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);
希望回答一些问题:)