【问题标题】:Why C# Language Specification doesn't mention about pointer types?为什么 C# 语言规范没有提到指针类型?
【发布时间】:2014-03-19 04:11:20
【问题描述】:

当我阅读C# Language Specification 时,我注意到Types section 中没有关于Pointer types 的内容。规范在another section 中提到了Pointer types,但我只是想知道他们为什么没有提到关于Types 部分中的指针? C# 绝对支持指针类型,所以在 Types 部分没有提及它们是否有技术原因?

【问题讨论】:

  • 所以您已经找到了您正在寻找的文档,但正在向社区询问为什么该规范是这样组织的?我不确定你真正的问题是什么,无论哪种方式,这样的问题都不适合 SO。
  • 如果我冒险猜测,可能是因为它们不安全,应该(几乎)不惜一切代价避免使用它们。
  • @Ginosaji 我强烈不同意这一点——指针类型肯定有它们的位置——它们很少需要,但“不惜一切代价避免它们”是错误的。它们可以发挥很大的作用(在正确的情况下使用)。任何工具都可能被滥用,就像指针一样。
  • @xxbbcc:在极少数情况下,不安全的代码可能是可取的甚至是必要的,这就是我包含“(几乎)”免责声明的原因。
  • @Ginosaji 你是对的,你确实这么说。 :)

标签: c# pointers types


【解决方案1】:

好的,从:

  • 第一个链接指向 2003 年的规范。它有点老了。
  • 第二个链接不是规范,而是编程指南?

C# 5 specification 中提到了指针,在 4 中。类型部分。就在本章的介绍中:

第三类类型,指针,仅在不安全代码中可用。这将在 §18.2 中进一步讨论。

指针类型的规则与值类型和引用类型的规则大不相同,我认为这就是为什么整章标题为 18 的原因。不安全的代码

【讨论】:

  • 很有趣。但是为什么this链接中的规范不是最新的,它在google中排在第一位。我没有选择2003
  • @Selman22 我不知道。您应该责怪 google 提供过时的数据作为最佳搜索结果,而不是 MSDN 显示历史数据(是的,还有人仍在使用 C# 2.0)。
【解决方案2】:

指针类型并不是 CLR 所理解的一种特殊类型,它只是指向另一个具体类型的指针,或者在 void* 的情况下至少是一个内存地址。

除了 CLR 为您提供更多控制权,并要求您的代码受信任并管理其自身的安全性这一事实之外;字符串和字符串*之间没有区别;间接后它们都是 System.String。

指针类型不是类型,它是指向类型的指针;只是 CLR 放弃了所有的安全检查,并假设您知道自己在做什么。

我想值得注意的是,任何通过'by-ref'传递的东西(即作为方法参数的类)无论如何都是.Net中的指针。它们只是受 CLR 保护。

【讨论】:

  • 不过,您也遇到了同样的基本问题 - 它们既是一种类型,又是一种引用某物的类型,但它们不是“类型”,因为它们不是f.ex 继承 System.Object。
  • 嗯,它们不继承 System.Object 的事实并不能证明它们不是类型。你仍然可以做typeof(IntPtr),你会得到Type 实例。正如规范中所述,它们只是不同类别的类型。
  • 来自 ECMA CLI 规范:“指针类型、函数指针类型和值类型不是对象类型。” (I.8.9) 指针不是类型,因为它们可以表示为System.Types。它们没有MethodTable,它们是根据它们指向的对象进行类型化的,但是“指针类型的值不是对象……给定指针类型的值,确定其确切类型是不可能的。” (I.8.9.2)
【解决方案3】:

我的猜测是(事实上不知道这一点)指针类型仅在不安全的上下文中可用(这在您链接到的 MSDN 页面中提到)。

内置类型的文档可能是最常见的一般用途,不包括不安全的场景(在 C# 中很少需要)。不过,我只是猜测,可能还有其他原因。

【讨论】:

  • 实际上,每当你在 C# 中通过引用传递某些东西时,无论你是否知道,你都在使用指针。
  • @RussC 我知道 - 我用 C# 做了很多不安全的编码。
  • 酷 :) 但是在 C# 中使用指针不需要进行不安全的编码,只是经常不认为自己使用的是指针。我想我会指出不同之处,因为这是新的 C# 开发人员并不总是能得到的东西。
  • @RussC - 啊,好吧,我完全错过了这一点。 :) 感谢您提到这一点,您是对的。
  • @RussC,您使用的是引用,而不是指针。 blogs.msdn.com/b/ericlippert/archive/2011/03/07/…
【解决方案4】:

可能是因为 C# 中的指针未经 CLR 验证,文档中也提到了这一点,默认情况下 C# 不支持指针运算。

对我来说,将托管和非托管规范分别保存在文档中更有意义。

您可能已经阅读了给定的链接,但是当您阅读此页面时它仍然更有意义。 http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 2010-10-02
    • 2017-07-31
    • 2019-03-19
    • 1970-01-01
    • 2013-06-27
    • 2020-09-11
    相关资源
    最近更新 更多