gpt4 book ai didi

c# - 为什么 C# 和 VB.NET 隐式编码 char* 不同?

转载 作者:可可西里 更新时间:2023-11-01 16:05:48 25 4
gpt4 key购买 nike

所以我有一个用 C++ 编写的函数,看起来像这样...

extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}

...我正在我当前的项目中使用它(用 C# 编写)。还有其他项目使用这个函数用 VB 写的,看起来像这样:

Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "_SomeFunction@4" (ByVal theData As String) As Integer

所以我尝试在 C# 中编写一个等效项,但发现使用字符串类型实际上对我不起作用 - 字符串会返回与我传递给它的相同数据。我尝试使用 "ref string" 来通过引用传递字符串,但我遇到了内存访问冲突。

经过一些挖掘,我发现这是 C# 中的正确实现:

[DllImport("MyDLL.dll", EntryPoint = "_SomeFunction@4")]
public static extern int SomeFunction(StringBuilder theData);

现在我知道 VB.NET 和 C# 有很大的不同,但我想我一直认为字符串就是字符串。如果一种语言可以将 char* 隐式编码为 String,为什么另一种语言不能,需要完全不同的类?

(为清楚起见编辑了标题)

最佳答案

Now I know that VB.NET and C# are quite different, but I suppose I always assumed that strings were strings

字符串是 immutable在 .net 中。问问自己,为什么 ByVal 传递不可变数据类型会导致值发生变化。这不会发生在普通函数上,只是发生在 Declare 上。

我猜这一切都与保持与经典 VB6 中以这种方式完成的 Declare 语句的某些向后兼容性有关。在我看来,这里的害群之马是 VB.net 代码而不是 C# 代码。

关于c# - 为什么 C# 和 VB.NET 隐式编码 char* 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com