C#中的指针及其在应用程序中的使用频率? 我认为,指针是C++编程语言中最难的概念之一。当我学习C++的时候,我花了大量的时间学习它。然而,现在我主要从事的项目完全是用C语言、VB.NET等语言编写的,事实上,我已经接触了C++将近4年了。尽管C#有指针,但我没有遇到在C#中必须使用指针的情况。所以我的问题是,通过使用指针,我们可以在C#中获得什么样的生产率?在什么情况下必须使用指针

C#中的指针及其在应用程序中的使用频率? 我认为,指针是C++编程语言中最难的概念之一。当我学习C++的时候,我花了大量的时间学习它。然而,现在我主要从事的项目完全是用C语言、VB.NET等语言编写的,事实上,我已经接触了C++将近4年了。尽管C#有指针,但我没有遇到在C#中必须使用指针的情况。所以我的问题是,通过使用指针,我们可以在C#中获得什么样的生产率?在什么情况下必须使用指针,c#,c++,pointers,C#,C++,Pointers,就我个人而言,我从来不需要在C#中使用指针。如果我需要这种功能,我就用C++/CLI编写代码,并从C#调用它。如果我需要将指针从C#传递到C++/CLI,或者从C++/CLI传递到C++/CLI,我将它们作为IntPtr传递,并将其转换为C++/CLI中需要的类型 在我看来,如果你在C#中使用指针,在99%的情况下,你使用的语言是错误的 编辑: C++/CLI的好处在于,您可以将单个类标记为纯本机编译。我做了大量的图像处理工作,这些工作需要很快完成;它使用了大量基于指针的代码。我通常有一个托管C

就我个人而言,我从来不需要在C#中使用指针。如果我需要这种功能,我就用C++/CLI编写代码,并从C#调用它。如果我需要将指针从C#传递到C++/CLI,或者从C++/CLI传递到C++/CLI,我将它们作为IntPtr传递,并将其转换为C++/CLI中需要的类型

在我看来,如果你在C#中使用指针,在99%的情况下,你使用的语言是错误的

编辑: C++/CLI的好处在于,您可以将单个类标记为纯本机编译。我做了大量的图像处理工作,这些工作需要很快完成;它使用了大量基于指针的代码。我通常有一个托管C++/CLI对象向前调用,在处理过程中发生的本地C++对象。我对本机代码和viola进行优化,获得了不错的性能提升

诚然,只有当通过执行本机优化代码获得的性能增益能够抵消托管到非托管转换的开销时,这才重要。在我的例子中,它总是这样。

我在C#中使用指针,只有在极少数情况下才使用指针,这些情况主要与发送/接收数据有关,其中必须将字节数组转换为结构,反之亦然。尽管如此,您通常不必直接处理指针


在某些情况下,您可以使用指针来提高性能,因为在封送处理程序中,有时您必须复制内存来访问数据,而使用指针,您可以直接访问数据(想想
Bitmap.Lock()
)。

您已经在C#中使用了很多指针,只是它们看起来不像指针。每次对类的实例执行操作时,都是指针。你已经获得了几乎所有的潜在好处,没有麻烦


在C#中可以更明确地使用指针,这就是大多数人所说的C#指针,但我认为这种情况非常罕见。它们对于链接到C库等可能很有用,但除此之外,我看不出它们有多大用处。

就我个人而言,我从来没有在.NET中使用指针的必要,但是如果你处理的是绝对性能关键的代码,你会使用指针。如果您查看System.String类,您将看到许多处理字符串操作的方法都使用指针。此外,在处理图像处理时,通常使用指针是很有用的。现在,人们肯定会争论这些应用程序是否应该首先在.NET中编写(我认为应该),但至少如果你需要挤出额外的速度,你可以

很好的一点-我在回答中忘记了从结构到字节数组的问题。我只是在最近的一个应用程序中查看了转换代码,在那里我甚至没有真正使用指针,只是GCHandle之类的东西。但是,在这些情况下,在处理数据时,你需要固定的东西。我认为Shiva询问原始指针,而不是关于伪装的基本指针的对象引用:但是,Shiva似乎想知道为什么,如果它们在C++中如此重要,那么它们在C语言中似乎就不那么重要了。部分答案是,一个好的C++程序使用指针的大部分是C、java和普通LISP等,抽象为对象引用等。这就是为什么C#和类似语言没有指针类型,或者至少没有常用的指针类型,几乎没有失去任何功能的原因。这可能会有所帮助——下面是一些关于C#中引用、指针和地址之间关系的思考: