从C++迁移到C#,关于指针的问题

3
我是一名C++程序员,目前正在进行迁移项目,需要将C++代码转换为C#,但我对C#了解甚少。
我需要迁移的C++代码包含许多指针操作,例如:
Hdr->States = (DspState*)baseAddress; // Converting the buffer to other type.

我的问题是,

  1. 如果我在C#中进行不安全的编程,只要我正确跟踪内存,是否会有任何危害。
  2. 或者在C#中是否有其他处理这些指针操作(有时是双指针)的方法。

2
如果你要重构你的代码,我建议你采取逐步实现目标的方式。首先为你打算重写的代码创建一个C++/CLI包装器。然后开始将业务逻辑转换成C#,只有在必要的情况下才重写代码。 - Dustin Kingen
@Romoku:我不是在重构代码,而是将原本用C++开发的项目完全迁移到C#。 - user1814023
如果C++代码正在分配未指定类型的缓冲区,而这些缓冲区稍后将用作特定类型,则您可能应该重新设计代码,以便在分配它们时使用确切的类型(类)。这是模板代码吗? - David R Tribble
2个回答

2
如果你正在将一个项目从C++移植到C#,你的第一个目标应该是完全停留在托管代码的“安全”世界内。仅因为你在C++代码中使用了指针并不意味着你必须在C#中也这样做。在C#中,不安全的代码应该是你的最后选择,并且只在非常特殊的情况下才需要使用。
在你的示例中,代码可以像这样在C#中实现,而且不需要任何指针或不安全操作。
BaseAddress baseAddress = ...
Hdr->States = (DspState)baseAddress;

或作为类型检查的强制转换操作

Hdr->States = baseAddress as DspState;

C# / .NET经常使用引用,引用在某种程度上类似于指针,但没有指针算术运算的危险。


0

C#授权不安全的上下文以允许使用指针,因此如果您的代码在C++中工作正常,则在C#中也应该可以。但是,根据您想要做什么,这可能不是最佳解决方案。 例如,如果您在C#中使用存在于C++中的库,则可能需要在C++中使用指针,但在C#中则使用引用。 如果您在帖子中展示的操作是您唯一使用的操作,我认为您不应该使用不安全的上下文来引用和取消引用指针,而应该对代码进行完整的转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接