你应该在C#代码中使用指针吗?有哪些好处?这是由微软推荐的吗?
你应该在C#代码中使用指针吗?有哪些好处?这是由微软推荐的吗?
以下是来自 “The Man” 的话:
C# 中很少需要使用指针,但有一些情况需要使用它们。例如,以下情况需要在不安全的上下文中使用指针:
在其他情况下使用不安全的上下文是不鼓励的。
具体而言,不应尝试在 C# 中编写 C 代码时使用不安全的上下文。
注意:
使用不安全上下文编写的代码不能保证安全,因此只有在完全信任代码时才会执行它。换句话说,不安全的代码无法在不受信任的环境中执行。例如,您无法直接从互联网运行不安全的代码。
GetPixel()
和SetPixel()
编写“安全”的版本。如果运行良好,则继续进行。如果速度过慢,则可能需要获取组成图像的实际位(为了示例简单,请勿考虑颜色矩阵)。使用不安全代码并没有什么“不好”,但它会增加项目的复杂性,因此只有在必要时才应使用。unsafe
和LockBits
之前,您应该仅使用LockBits
作为中间步骤。 - TheLethalCoder我不记得曾经有这样的需求 - 但我没有做过太多的互操作。我认为这是最常见的应用程序:调用本地代码。 在极少数情况下,使用指针可以优化一些代码,但在我看来这种情况非常罕见。
如果需要参考文献,我认为自己在C#方面相当有经验,但如果我必须编写任何不安全的代码,我会查阅规范/书籍/MSDN进行指导。当然,会有很多人对不安全的代码感到满意,但对查询表达式等技术不太熟悉...
我认为主要问题是:
我使用了不安全的代码来模拟用户身份,以允许服务访问网络共享。只要你知道自己在做什么,这并不是问题。
不安全的代码是.NET CLR的一个完全支持的功能。它能够提高性能并与二进制代码兼容。运行时是一个沙盒,可以防止程序崩溃,但这也带来了一些成本。在处理大块内存数据(例如图像处理)等需要进行极端密集操作的情况下,放弃正常的运行时安全措施会更快。
尽管如此,我认为大多数人都会说“不要这样做”。在正常开发过程中,绝大多数.NET开发人员不会遇到只有使用不安全代码才能解决的问题。
如果您需要,可以使用它们;通常情况下,这将是在处理一些棘手的交互操作场景时(例如当我为.NET 1.0编写DPAPI托管包装器时就需要它们),但非常偶尔地,可能会通过使用stackalloc
或类似方法来提高性能(在分析后!)。
正如微软所建议的那样,因为他们是C#的设计者,并且他们决定在其中添加编写unsafe
代码的功能。从关键字的选择以及用该关键字界定编写它的方法/类的要求可以看出,它并不是旨在成为默认实现选择。
像BitConverter一样的重新解释类型不提供。
具体来说,将一个无符号整数转换为int用于哈希函数,其中您关心的仅是位。
在需要将结构体视为已知长度的byte*的情况下,使用一些有用的、经过良好推理的C或C++惯用函数,这对于哈希非常有用。
通过对它们的数组执行极快的二进制序列化(非常特定的)内存结构体,但老实说,最好还是转到C++/CLI。
必须说,在许多情况下,需要指针的任务通常可以通过在C++/CLI中完成并将其导入到您的C#项目作为dll来更好地解决。这不会改变代码是否“安全”,但它使得操作基于指针的结构的一组有用的功能更易于访问。如果您真的想要,它还允许您玩弄通用类型或枚举。
大多数开发人员需要这样做的可能性确实很小。但在需要时非常有用...
使用不安全代码就像忘记了 .Net Framework 的好处一样,我曾经用它们创建过老式的结构,比如堆栈等,但那只是为了学校,现在我没有必要使用它们。