我理解指针,并且很少需要在C#代码中使用它们.我的问题是:在一段代码中明确说明"不安全"的原因是什么.另外,为什么必须更改编译器选项以允许"不安全"代码?
结论: CLR(或语言规范)中的内容使得我们不能随时使用指针(很像C和C++)而不必键入"unsafe"并更改编译器选项?
澄清一下:我知道"不安全"和"安全"的代码是什么.这只是一个问题,为什么我们必须做所有额外的工作(好吧,不是那么多)只是为了能够使用这些功能.
还有用C#创建者安德斯·海尔斯伯格,关于该主题触及的采访这里.基本上,正是@Marc Gravell所说的:首先是类型安全,通过明确声明不安全.
所以回答你的问题:CLR中没有任何东西阻止它; 它是一种语言习语,旨在让您在处理类型时使用安全手套.如果你想脱下手套,这是你的选择,但你必须做出积极的选择才能脱下手套.
编辑:
澄清一下:我知道"不安全"和"安全"的代码是什么.这只是一个问题,为什么我们必须做所有额外的工作(好吧,不是那么多)只是为了能够使用这些功能.
正如我所接受的采访中提到的那样,这是一个明确的设计决定.C#本质上是Java的演变,在Java中,你根本就没有指针.但设计师想要指点; 但是因为C#通常会引入Java开发人员,他们认为如果默认行为与Java类似,即没有指针,同时仍允许通过显式声明使用指针,那将是最好的.
所以"额外的工作"是故意强迫你在做之前考虑你在做什么.通过明确,它迫使你至少考虑:"为什么我这样做?当引用类型足够时,我真的需要一个指针吗?"
它主要是关于可验证的.通过陈述unsafe
,手套关闭 - 系统无法再保证您的代码不会失控.在大多数情况下,非常希望留在安全区.
部分信任(插件等)会更加明显,但在常规代码中仍然很有用.