探究.NET String

调用Win32API时,LPSTR应该传什么?

String一致性和驻留性?

String是引用还是值类型?

Imports System.Text 
Module Module1
    'Win32原形函数BOOL GetComputerName(LPWSTR lpBuffer,LPDWORD nSize)
    Public Declare Auto Function GetComputerName Lib "Kernel32" (ByVal lpBuff As StringBuilder, ByRef nSize As Integer) As Integer
    Sub Main()
        '调用Win32 API
        'Dim name As String = New String(vbNullChar, 20)
        Dim name As StringBuilder = New StringBuilder(vbNullChar, 20)
        Dim size As Integer = 20
        GetComputerName(name, size)
        Console.WriteLine("Hello: " & name.ToString())
        '.NET平台上,探究String一致性和驻留性
        Dim s1 As String = "abc" '来自驻留池,驻留池没有,则创建;返回驻留池地址
        Dim s2 As String = "abc" '来自驻留池;返回驻留池地址
        Dim s3 As String = New String("abc") '来自堆,驻留池没有,先在驻留池创建,然后在堆上创建;返回堆地址
        Dim s0 = "ab"
        Dim s4 = s0 & "c"
        Dim b1 = ReferenceEquals(s1, s2) 'True s1,s2来自驻留池
        Dim b2 = ReferenceEquals(s1, s3) 'False s1来自驻留池,s3来自堆
        Dim b3 = ReferenceEquals(s1, s4) 'False s1来自驻留池,s4来自堆(动态创建String)
        '关于String 是值类型还是引用,回答:引用
        Dim str = "被修改文字"
        ChangeStringByVal(str)
        Console.WriteLine("str: " & str) 'str:被修改文字
        ChangeStringByRef(str)
        Console.WriteLine("str: " & str) 'str:通过传递引用参数修改
        Console.ReadKey()    End Sub
    ''' <summary>
    ''' 尝试通过ByVal,修改传递String(引用类型);
    ''' str1和str 是两个引用,指向同一个地址
    ''' 由于.NET下String的不可变特性,重新赋值,导致str1指向了一个新的地址
    ''' </summary>
    ''' <param name="str1"></param>
    Sub ChangeStringByVal(ByVal str1 As String)
        str1 = "通过传递值参数修改"
    End Sub
    ''' <summary>
    ''' 尝试通过ByRef,修改传递String(引用类型);
    ''' str2和str 是同一个引用,指向同一个地址
    ''' 重新赋值,导致str2指向了一个新的地址;
    ''' </summary>
    ''' <param name="str2"></param>
    Sub ChangeStringByRef(ByRef str2 As String)
        str2 = "通过传递引用参数修改"
    End Sub
End Module

猜你喜欢

转载自www.cnblogs.com/chenjintao/p/12630052.html