【问题标题】:What are c# pointers and what kinds of tasks require them? [closed]什么是 c# 指针,什么样的任务需要它们? [关闭]
【发布时间】:2012-04-15 00:45:54
【问题描述】:

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

【问题讨论】:

  • 你应该了解c中的指针是什么。完全一样。对于ref 部分:只需阅读MSDN,或尝试使用一次。
  • 它们是内存位置 - 具有足够字节的 int 值来表示进程地址空间中的任何位置,不是吗?
  • @gdoron,是的,我发现 MSDN 是一场赌博——有时很清楚,我很高兴我去了那里,而其他时候我希望我只是把它放在 stackoverflow 上,让那些可以在他们睡着的时候回答给我用漂亮简洁的话......这就是为什么这是一个如此受欢迎的地方吧?
  • 如果有人能详细说明为什么这个问题没有建设性,我会在未来努力改进 - 如果答案是 RTFM,那么我不同意,但我同时理解你来自哪里

标签: c# pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在我的理解中,指针是用来优化性能的,在这里你闯入“不安全”的领域,直接操作内存地址。

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

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

    Unsafe Pointer iteration and Bitmap - why is UInt64 faster?

    肯定还有其他典型的场景,但是一个普通的C#应用程序一般来说是不需要指针的。

    【讨论】:

      【解决方案3】:

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

      希望能回答一些问题:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多