你应该在C#代码中使用指针吗?有什么好处?它是由The Man(微软)推荐的吗?
来自"男人"本人:
在C#中很少使用指针,但有些情况需要它们.例如,在以下情况下,使用不安全的上下文来允许指针是有保证的:
处理磁盘上的现有结构
高级COM或平台调用场景,涉及带有指针的结构
性能关键代码
不鼓励在其他情况下使用不安全的上下文.
具体来说,不应该使用不安全的上下文来尝试在C#中编写C代码.
警告:
使用不安全上下文编写的代码无法验证是否安全,因此仅在代码完全受信任时才会执行.换句话说,不安全的代码不能在不受信任的环境中执行.例如,您无法直接从Internet运行不安全的代码.
参考
如果必须的话.
假设您需要对大灰度图像进行假彩色,例如2000x2000像素.首先使用GetPixel()
和编写'安全'版本SetPixel()
.如果有效,那么继续前进吧.如果证明太慢,你可能需要得到构成图像的实际位(为了示例,忘记颜色矩阵).使用不安全的代码并没有"坏",但它增加了项目的复杂性,因此只应在必要时使用.
我不记得曾经这样做过 - 但我没有做太多的互操作.这是最常见的应用程序,我相信:调用本机代码.很少有几次使用指针允许你优化一些代码,但在我的经验中这是非常罕见的.
如果它是任何指南,我认为自己在C#中非常有经验,但如果我不得不做任何不安全的代码,我必须查阅spec/books/MSDN来指导我.当然会有很多人对不安全的代码感到满意,但不熟悉(比如说)查询表达式......
我想说的主要问题是: -
不安全的代码不可验证.这意味着代码只能由用户从完全可信的上下文中运行,因此如果您需要用户从不完全信任的任何地方运行代码(例如,网络共享未配置为如此),那么您就是拧紧.
缺乏可验证性(不确定这是否真的是一个单词)也意味着你可能会破坏程序中的内存.你可能会把整个类的错误带回你的应用程序 - 缓冲区超支,悬空指针,yada yada yuck yuck.更不用说有可能破坏内存中的数据结构而没有意识到你的指针变得奇怪了.
如果您希望不安全的代码访问托管对象,则需要"固定"它们.这意味着不允许GC在内存中移动对象,因此托管堆可能会碎片化.这有性能影响; 因此,确定此问题是否未超过任何潜在的性能增益始终是重要的.
对于不习惯非托管方法的程序员来说,您的代码变得更难理解.然后他们可能更容易用一些"自由"不安全的代码给他们射击.
您可以编写非类型安全的代码; 这真的很好地消除了一个很好的温暖模糊管理语言的很多优点.现在你可以遇到可怕的类型安全问题.为什么要倒退呢?
它使你的代码变得更加丑陋.
我相信还有更多可以添加到列表中的内容; 一般来说,正如其他人所说的那样 - 除非你必须通过p/invoke调用一个非托管方法,这需要一些特殊的指针功能.即使这样,编组人员也会主要阻止对它的需要.
除非必要,否则"男人"也会说避免.
哦,顺便说一句关于在MSDN上固定的好文章.