1

一段时间以来,我一直在研究 Visual Basic .NET 中的 C 样式指针。我遇到了http://support.microsoft.com/kb/199​​824 ?wa=wsignin1.0但我不知道这是否正确或如何应用它。我已经使用 c 中的程序编写了一个简单的指针,我希望它将逐行转换为 Visual Basic,并在必要时添加注释。这是C:

int main()
{
    int *myNumber=3; //the * means it's a pointer

    doubleIt(*myNumber); //we use the void, the * means it returns a value not address
    printf("%d",myNumber); //we print the variable

    return 0; //we terminate the function
}

void doubleIt(int input)
{
    input*=2; //double the input
}
4

2 回答 2

5

您的 C 代码存在一些问题,其中之一是:

int *myNumber=3; //the * means it's a pointer  

如果不先为其分配内存,则无法为这样的指针分配值。

因此,您将执行以下操作:

int* myNumber = malloc(sizeof(int));
*myNumber  = 3;
free(myNumber);

VB.NET 没有指针的概念。一切(即 every Object)都是一个引用,这与不使用 Interop 的情况下得到的指针差不多。如果您需要进行互操作IntPtr,则可以使用可用于表示指针类型的类型。

您的 VB.NET 程序可能看起来像这样:(如果语法不完全正确,请原谅我,已经有一段时间了)

Sub Main
    Dim myNumber As Integer = 3
    doubleIt(myNumber)
    Console.WriteLine(myNumber)
End Sub

Sub doubleIt(ByRef val As Integer)
    val *= 2
End Sub
于 2012-12-04T16:38:50.730 回答
1

在 .NET 中,有两种对象类型。有引用类型(Class)和值类型(Structure)。在 .NET 中,不是为每个变量决定该变量是否为指针,而是始终将所有引用类型对象视为指针,而所有值类型对象都不是。因此,例如:

'Create one object of each type
Dim builder As New StringBuilder()  'Reference type
Dim size As Integer  'Value type

'Make a "copy" of each
Dim copyBuilder As StringBuilder = builder
Dim copySize As Integer = size

'Change the value of the original object
builder.Append("Test")
size = 33

'Check if the "copy" changed
Console.WriteLine("{0} = {1}", builder.ToString(), copyBuilder.ToString())
Console.WriteLine("{0} <> {1}", size, copySize)

当您运行该代码时,它将输出以下内容:

Test = Test
33 <> 0

因此,如您所见,StringBuilder对象的行为类似于指针,而Integer对象则不然。但是,正如 Tony 指出的那样,即使使用值类型,您也可以“通过引用”将值传递给方法。当一个方法指定它的一个参数是ByRef,而不是ByVal,这意味着该方法可能会在内部更改变量的值,并且更改将影响调用代码中的变量。

此外,您可能想对装箱和拆箱进行一些研究。

于 2012-12-04T17:06:01.333 回答