Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否应该在C#中使用指针(不安全代码)?_C#_.net_Pointers_Coding Style_Unsafe - Fatal编程技术网

是否应该在C#中使用指针(不安全代码)?

是否应该在C#中使用指针(不安全代码)?,c#,.net,pointers,coding-style,unsafe,C#,.net,Pointers,Coding Style,Unsafe,你应该在你的C代码中使用指针吗?有什么好处?这是微软推荐的吗?我不记得曾经这么做过——但我没有做过多少互操作。我相信这是最常见的应用程序:调用本机代码。很少有时候,使用指针可以优化某些代码,但在我的经验中,这是非常罕见的 P>如果它是一个指南,我认为自己在C语言中是很有经验的,但是如果我必须做任何不安全的代码,我必须咨询规范/书籍/MSDN来指导我。当然,会有很多人对不安全的代码感到满意,但对(比如)查询表达式不太熟悉……如果需要,你应该使用它们;主要是在处理一些棘手的互操作场景时(例如,当我

你应该在你的C代码中使用指针吗?有什么好处?这是微软推荐的吗?

我不记得曾经这么做过——但我没有做过多少互操作。我相信这是最常见的应用程序:调用本机代码。很少有时候,使用指针可以优化某些代码,但在我的经验中,这是非常罕见的


<> P>如果它是一个指南,我认为自己在C语言中是很有经验的,但是如果我必须做任何不安全的代码,我必须咨询规范/书籍/MSDN来指导我。当然,会有很多人对不安全的代码感到满意,但对(比如)查询表达式不太熟悉……

如果需要,你应该使用它们;主要是在处理一些棘手的互操作场景时(例如,当我在.NET 1.0中为DPAPI编写托管包装器时,它们是必需的),但偶尔也可能是通过使用
stackalloc
或类似工具来提高性能(评测后!)

它是由微软推荐的,因为他们是C#的设计者,他们决定在其中添加写
不安全的
代码的功能。您可以从关键字的选择和描述使用关键字编写它的方法/类的要求中看出,它不是设计为事实上的实现选择。

当然,它不是“推荐的”,这就是为什么它被标记为“不安全的”。但别让它吓跑你。尽管如此,它应该让您仔细查看代码。也许有一种托管方式可以做到这一点?

是.NET CLR完全支持的功能。其优点是性能和与二进制代码的兼容性。运行时是一个沙箱,它可以防止您崩溃和烧毁,但这是有代价的。在对内存中的大blob执行非常密集的操作的情况下,例如图像处理,跳出运行时提供的正常安全性会更快

话虽如此,我想这里的大多数人都会说“不要这样做”。绝大多数.NET开发人员在正常活动中不会遇到只有使用不安全代码才能解决的情况。

如果必须的话


假设您需要对大灰度图像进行假彩色处理,例如2000x2000像素。首先使用
GetPixel()
SetPixel()
编写“安全”版本。如果这行得通,太好了,继续前进。如果这被证明太慢,您可能需要获取组成图像的实际位(为了本例,请忘记颜色矩阵)。使用不安全代码并没有什么“坏处”,但它增加了项目的复杂性,因此应该只在必要时使用。

我使用不安全代码来使用模拟来允许服务访问网络共享。如果你知道自己在做什么,这不是问题。

来自“男人”自己:

在C#中很少需要使用指针,但在某些情况下需要使用指针。例如,使用不安全的上下文来允许指针是由以下情况保证的:

  • 处理磁盘上的现有结构
  • 高级COM或平台调用场景,其中包含带有指针的结构
  • 性能关键代码
不鼓励在其他情况下使用不安全上下文

具体来说,不应使用不安全的上下文来尝试在C#中编写C代码。

警告:

无法验证使用不安全上下文编写的代码是否安全,因此只有在完全信任代码时才会执行该代码。换句话说,不安全代码不能在不受信任的环境中执行。例如,您不能直接从Internet运行不安全代码


使用不安全的代码就像忘记了.Net框架的好处,我曾经用它们来创建像堆栈之类的老式结构,但那只是为了学校,现在我没有必要使用它们。

如果它能让你的代码更短、更清晰,就这样做


“遵循你的意愿,适当注意拐角处的警察。”

重新解释BitConverter未提供的like类型转换。
具体地说,将unint转换为哈希函数的int,您只关心位

使用一些有用的、合理的结构上的C或C++的惯用函数,在这些结构中,需要将它们作为一个已知长度的字节*,再次对散列最有用。 非常快的内存结构(非常特定)的二进制序列化(通过对它们的数组进行序列化),不过老实说,这最好通过直接使用C++/CLI来实现

必须指出的是,在许多情况下,需要指针的任务通常可以通过在C++/CLI中执行并将其作为dll导入到C#项目中来更好地解决。它不会改变代码是否“安全”,但它使一系列用于在基于指针的结构上操作的有用函数更容易访问。如果您真的愿意,它还允许您处理泛型类型或枚举


大多数开发人员需要这样做的可能性确实很小。但在您需要时非常有用…

我想说的主要问题是:-

  • 不安全代码是不可验证的。这意味着代码只能由用户从完全受信任的上下文运行,因此,如果您需要用户从不完全受信任的任何位置运行代码(例如,未配置为完全受信任的网络共享),您就完蛋了
  • 缺乏可验证性(嗯,不确定这是否真的是一个词)也意味着您可能会弄乱程序中的内存。您可能会将所有种类的bug带回到应用程序中—缓冲区溢出、指针悬空、雅达-雅达-雅达-雅克-雅克-雅克。更不用说可能会损坏内存中的数据结构,而不知道指针何时会出现异常
  • 如果希望不安全代码访问托管对象,则需要