Visual Basic .NET中的C风格指针
我一直在研究Visual Basic .NET中的C风格指针。 我遇到过http://support.microsoft.com/kb/199824?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 }
您的C代码存在一些问题,其中之一是:
int *myNumber=3; //the * means it's a pointer
如果没有先为其分配内存,就不能为这样的指针赋值。
所以你会做以下事情:
int* myNumber = malloc(sizeof(int)); *myNumber = 3; free(myNumber);
VB.NET没有指针的概念。 所有东西(即每个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
在.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
,这意味着该方法可以在内部更改变量的值,并且更改将影响调用代码中的变量。
此外,您可能想要对拳击和拆箱进行一些研究。