Visual Basic 15.8 的新增功能

本主题列出每个 Visual Basic 版本的重要功能名以及该语言最新版本中的新功能和增强功能的详细说明。

当前版本

Visual Basic 15.8/Visual Studio 2017 版本 15.8
有关新功能,请参阅 Visual Basic 15.8

早期版本

Visual Basic 15.5/Visual Studio 2017 版本 15.5
有关新功能,请参阅 Visual Basic 15.5

Visual Basic 15.3/Visual Studio 2017 版本 15.3
有关新功能,请参阅 Visual Basic 15.3

Visual Basic 2017/Visual Studio 2017
有关新功能,请参阅 Visual Basic 2017

Visual Basic/Visual Studio 2015
有关新功能,请参阅 Visual Basic 14

Visual Basic/Visual Studio 2013
.NET Compiler Platform (“Roslyn”) 的技术预览

Visual Basic/Visual Studio 2012
Async 和 await 关键字、迭代器、调用方信息特性

Visual Basic, Visual Studio 2010
自动实现的属性、集合初始值设定项、隐式行继续符、动态、泛型协变/逆变、全局命名空间访问

Visual Basic/Visual Studio 2008
语言集成查询 (LINQ)、XML 文本、本地类型推断、对象初始值设定项、匿名类型、扩展方法、本地 var 类型推断、lambda 表达式、if 运算符、分部方法、可以为 null 的值类型

Visual Basic/Visual Studio 2005
My 类型和帮助程序类型(对应用、计算机、文件系统、网络的访问)

Visual Basic/Visual Studio .NET 2003
移位运算符、循环变量声明

Visual Basic/Visual Studio .NET 2002
Visual Basic.NET 的首次发布

Visual Basic 15.8

优化的浮点到整数转换

在以前版本的 Visual Basic 中,双精度单精度值到整数的转换的性能相对较差。 Visual Basic 15.8 显著增强了以下情况下的浮点到整数转换的性能:将以下任何方法返回的值传递到一个 Visual Basic 内部整数转换函数(CByte、CShort、CInt、CLng、CSByte、CUShort、CUInt、CULng)时,或是在 Option Strict 设置为 Off 的情况下将以下任何方法返回的值隐式强制转换为整型类型时:

此优化使代码可以更快运行 -- 对于进行大量到整型类型的转换的代码,可快达两倍。 下面的示例说明了受此优化影响的一些简单方法调用:

VB复制

Dim s As Single = 173.7619
Dim d As Double = s 

Dim i1 As Integer = CInt(Fix(s))               ' Result: 173
Dim b1 As Byte = CByte(Int(d))                 ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s))     ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d))      ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s))        ' Result: 174

请注意,这会截断而不是舍入浮点值。

Visual Basic 15.5

非尾随命名参数

在 Visual Basic 15.3 和更早版本中,当方法通过位置和名称调用包含的参数时,位置参数必须位于命名参数之前。 从 Visual Basic 15.5 开始,只要到最后一个位置参数的所有参数都处于正确的位置,位置参数和命名参数就可以以任何顺序出现。 当使用命名参数提高代码的可读性时,此方法特别有用。

例如,以下方法调用在命名参数之间有两个位置参数。 命名参数清楚地表明值 19 代表年龄。

VB复制

StudentInfo.Display("Mary", age:=19, #9/21/1998#)

Private Protected 成员访问修饰符

这个新的关键字组合定义了一个成员,该成员可以由其包含的类中的所有成员访问,也可以由从包含的类派生的类型访问,但前提是它们也可以在包含的程序集中找到。 由于无法继承结构,因此 Private Protected 仅适用于类的成员。

前导十六进制/二进制/八进制分隔符

Visual Basic 2017 新增支持下划线字符 (_) 作为数字分隔符。 从 Visual Basic 15.5 开始,可以使用下划线字符作为前缀和十六进制、二进制或八进制数字之间的前导分隔符。 以下示例使用前导数字分隔符将 3,271,948,384 定义为十六进制数字:

VB复制

Dim number As Integer = &H_C305_F860

若要使用下划线字符作为前导分隔符,必须将以下元素添加到 Visual Basic 项目 (*.vbproj) 文件中:

XML复制

<PropertyGroup>
  <LangVersion>15.5</LangVersion>
</PropertyGroup>

Visual Basic 15.3

命名元组推理

从变量分配元组元素的值时,Visual Basic 会从相应的变量名推断元组元素名;因此无需显式命名元组元素。 以下示例使用推理创建元组,其中包含三个命名元素statestateName 和 capital

VB复制

Dim state = "MI"
Dim stateName = "Michigan"
Dim capital = "Lansing"
Dim stateInfo = ( state, stateName, capital )
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")   
' The example displays the following output:
'      Michigan: 2-letter code: MI, Capital Lansing

其他编译器开关

Visual Basic 命令行编译器现在支持 -refout 和 -refonly 编译器选项,可控制引用程序集的输出。 -refout 定义引用程序集的输出目录,-refonly 指定只通过编译输出一个引用程序集。

Visual Basic 2017

元祖

元组是一种轻量级数据结构,通常用于从单个方法调用返回多个值。 一般情况下,若要从方法返回多个值,必须执行以下操作之一:

  • 定义自定义类型(Class 或 Structure)。 这是重量级解决方案。

  • 定义一个或多个 ByRef 参数,以及从方法返回一个值。

通过 Visual Basic 对元组的支持,可快速定义元组、为其值分配语义名称(可选),并快速检索其值。 以下示例包装对 TryParse 方法的调用,并返回一个元组。

VB复制

Imports System.Globalization

Public Module NumericLibrary
    Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
        Dim number As Integer
        Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
    End Function
End Module

然后,可以调用该方法并使用如下所示的代码处理返回的元组。

VB复制

Dim numericString As String = "123,456"
Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
'      Output: Success: 123,456

二进制文本和数字分隔符

可通过使用前缀 &B 或 &b 定义二进制文本。 此外,可以将下划线字符 _ 用作数字分隔符,以增强可读性。 以下示例使用这两项功能分配 Byte 值,并将其显示为十进制、十六进制和二进制数字。

VB复制

Dim value As Byte = &B0110_1110
Console.WriteLine($"{NameOf(value)}  = {value} (hex: 0x{value:X2}) " +
                  $"(binary: {Convert.ToString(value, 2)})")
' The example displays the following output:
'      value  = 110 (hex: 0x6E) (binary: 1101110)      

有关详细信息,请参阅 ByteIntegerLongShortSByteUIntegerULong 和 UShort 数据类型的“文本分配”部分。

支持 C# 引用返回值

从 C# 7.0 开始,C# 支持引用返回值。 也就是说,当调用方法收到引用返回的值时,可以更改引用的值。 Visual Basic 不允许使用引用返回值创建方法,但允许使用和修改引用返回值。

例如,用 C# 编写的以下 Sentence 类包括 FindNext 方法,该方法查找句子中以指定的子字符串开头的下一个单词。 该字符串作为引用返回值返回,方法引用传递的 Boolean 变量指示搜索是否成功。 这意味着调用方不仅可以读取返回的值;还可以修改此值,此修改在 Sentence 类中反映。

C#复制

using System;
 
public class Sentence
{
    private string[] words;
    private int currentSearchPointer;
    
    public Sentence(string sentence)
    {
        words = sentence.Split(' ');
        currentSearchPointer = -1;
    }
    
    public ref string FindNext(string startWithString, ref bool found)
    {
        for (int count = currentSearchPointer + 1; count < words.Length; count++)
        {
            if (words[count].StartsWith(startWithString))
            {
                currentSearchPointer = count;
                found = true;
                return ref words[currentSearchPointer];
            }
        }
        currentSearchPointer = -1;
        found = false;
        return ref words[0];
    }
    
    public string GetSentence()
    {
        string stringToReturn = null;
        foreach (var word in words)
            stringToReturn += $"{word} ";
      
        return stringToReturn.Trim();    
    }
}

在最简单的形式中,可以使用如下所示的代码修改句子中找到的单词。 请注意,不是将值分配到方法,而是将值分配到方法返回的表达式(即引用返回值)。

VB复制

Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = "A good" 
Console.WriteLine(sentence.GetSentence()) 
' The example displays the following output:
'      A good time to see the world is now.

但是,此代码的问题是,如果找不到匹配项,方法将返回第一个单词。 由于该示例不检查 Boolean 参数的值以确定是否找到匹配项,所以如果没有匹配项,则修改第一个单词。 以下示例对此进行了更正:如果没有匹配项,则将第一个单词替换为自身。

VB复制

Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = IIf(found, "A good", sentence.FindNext("B", found)) 
Console.WriteLine(sentence.GetSentence()) 
' The example displays the following output:
'      A good time to see the world is now.

更好的解决方案是使用引用将引用返回值传递到的帮助程序方法。 然后,帮助程序方法可以修改引用传递给其的参数。 以下示例执行该操作。

VB复制

Module Example
   Public Sub Main()
      Dim sentence As New Sentence("A time to see the world is now.")
      Dim found = False
      Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found) 
      Console.WriteLine(sentence.GetSentence()) 
   End Sub
   
   Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _ 
                    As (originalString As String, found As Boolean) 
      Dim originalString = stringFound
      If found Then stringFound = replacement
      Return (originalString, found)   
   End Function
End Module
' The example displays the following output:
'      A good time to see the world is now.

有关详细信息,请参阅引用返回值

Visual Basic 14

Nameof
可以在错误消息中使用类型或成员的非限定字符串名,而无需对字符串进行硬编码。 这使代码可以在重构时保持正确。 此功能也可用于挂接“模型-视图-控制器”MVC 链接并触发属性更改事件。

字符串内插
可以使用字符串内插表达式构造字符串。 内插字符串表达式类似于包含表达式的模板字符串。 与复合格式设置相比,内插字符串在自变量方面更易于理解。

NULL 条件成员访问和索引
可以在执行成员访问 (?.) 或索引 (?[]) 操作之前以非常轻量的语法方式测试是否存在 null。 这些运算符可帮助编写更少的代码来处理 null 检查,尤其是对于下降到数据结构。 如果左操作数或对象引用为 null,则操作会返回 null。

多行字符串文本
字符串可以包含换行符序列。 不再需要使用 <xml><![CDATA[...text with newlines...]]></xml>.Value 这种旧的解决方法

注释
可以在隐式行继续符之后、初始值设定项表达式内部以及 LINQ 表达式项之间放置注释。

更智能的完全限定名称解析
如果提供了 Threading.Thread.Sleep(1000) 这类代码,Visual Basic 过去会查找命名空间“Threading”,发现它在 System.Threading 与 System.Windows.Threading 混淆,然后报告错误。 Visual Basic 现在将这两个可能的命名空间结合在一起进行考虑。 如果显示完成列表,则 Visual Studio 编辑器会在完成列表中列出这两种类型中的成员。

以年份开头的日期文本
可以使用 yyyy-mm-dd 格式的日期文本 #2015-03-17 16:10 PM#

只读接口属性
可以使用读写属性实现只读接口属性。 该接口可保证最小功能,不会阻止实现类允许设置属性。

TypeOf <表达式> IsNot <类型>
为提高代码的可读性,现在可以将 TypeOf 与 IsNot 一起使用。

#Disable Warning <ID> 和 #Enable Warning <ID>
可以对源文件中的区域禁用和启用特定警告。

XML 文档注释改进
编写文档注释时,可获取智能编辑器和生成支持,以用于验证参数名、正确处理 crefs(泛型、运算符等)、着色和重构。

部分模块和接口定义
除了类和结构之外,还可以声明部分模块和接口。

方法体中的 #Region 指令
可以将 #Region…#End Region 限定符放置在文件中、函数内部甚至是跨越函数体的任何位置。

替代定义是隐式重载
如果你向定义添加 Overrides 修饰符,则编译器会隐式添加 Overloads,以便你可以在常见情况下输入更少的代码。

属性参数中允许使用 CObj
当 CObj(...) 在特性构造中使用时,编译器过去会发出错误,指出它不是常量。

从不同接口声明和使用不明确的方法
以下代码以前会生成错误,从而阻止你声明 IMock 或调用 GetDetails(如果这些内容已在 C# 中声明):

VB复制

Interface ICustomer  
  Sub GetDetails(x As Integer)  
End Interface  
  
Interface ITime  
  Sub GetDetails(x As String)  
End Interface  
  
Interface IMock : Inherits ICustomer, ITime  
  Overloads Sub GetDetails(x As Char)  
End Interface  
  
Interface IMock2 : Inherits ICustomer, ITime  
End Interface  

现在,编译器会使用正常的重载决策规则来选择最合适的 GetDetails 进行调用,你可以在 Visual Basic 中声明接口关系(如示例中所示的这些关系)。

 

 

 

内插的字符串 (Visual Basic 参考)

用于构造字符串。 内插字符串类似于包含内插表达式的模板字符串。 内插字符串返回的字符串可替换内插表达式并且包含其字符串表示形式。 此功能现已推出 Visual Basic 14 及更高版本。

复合格式字符串相比,内插字符串的参数更易于理解。 例如,内插字符串

VB复制

Console.WriteLine($"Name = {name}, hours = {hours:hh}")

包含 2 个内插表达式:“{name}”和“{hours:hh}”。 等效复合格式字符串为:

VB复制

Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours); 

内插字符串的结构为:

VB复制

$"<text> {<interpolated-expression> [,<field-width>] [:<format-string>] } <text> ..."  

其中:

  • field-width 是一个带符号整数,表示字段中的字符数。 如果为正数,则字段右对齐;如果为负数,则左对齐。

  • “格式字符串”是适合正在设置格式的对象类型的格式字符串。 例如,对于DateTime的值,它可以是标准日期和时间格式字符串如"D"或"d"。

 重要

字符串开头的 $ 和 " 之间不能有任何空格。 这样做会导致编译器错误。

可以在可使用字符串的任何位置使用内插字符串。 每次执行带内插字符串的代码时,都会计算内插字符串。 这有助于分隔内插字符串的定义和计算结果。

若要在内插字符串中包含大括号(“{”或“}”),请使用两个大括号,即“{{”或“}}”。 请参阅“隐式转换”部分以获取详细信息。

如果内插字符串包含在内插字符串中具有特殊意义的其他字符,例如引号 (")、冒号 (:) 或逗号 (,),则出现在文本中时应转义这些字符;如果它们是内插表达式中随附的语言元素,则应将其包括在由括号分隔的表达式内。 以下示例转义了引号以将其包括在结果字符串中,并使用括号来分隔表达式 (age == 1 ? "" : "s"),以防冒号被解读为格式字符串的开头。

VB复制

Public Module Example
   Public Sub Main()
      Dim name = "Horace"
      Dim age = 34
      Dim s1 = $"He asked, ""Is your name {name}?"", but didn't wait for a reply."
      Console.WriteLine(s1)
      
      Dim s2 = $"{name} is {age:D3} year{(If(age = 1, "", "s"))} old."
      Console.WriteLine(s2) 
   End Sub
End Module
' The example displays the following output:
'       He asked, "Is your name Horace?", but didn't wait for a reply.
'       Horace is 034 years old.
' </Snippet1>

隐式转换

内插字符串有 3 种隐式类型转换:

  1. 将内插字符串转换为 String。 下例返回一个字符串,其内插字符串表达式已替换为字符串表示形式。 例如:

    VB复制

    Public Module Example
       Public Sub Main()
          Dim name = "Bartholomew"
          Dim s1 = $"Hello, {name}!"  
          Console.WriteLine(s1)
       End Sub
    End Module
    ' The example displays the following output:
    '      Hello, Bartholomew!
    ' </Snippet1>
    

    这是字符串解释的最终结果。 出现的所有双大括号(“{{”和“}}”)都转换为单大括号。

  2. 将内插字符串转换为 IFormattable 变量,使用此变量可通过单个 IFormattable 实例创建多个包含区域性特定内容的结果字符串。对于包括诸如各区域性的正确数字和日期格式之类的内容,这种转换很有用。 出现的所有双大括号(“{{”和“}}”)仍保留为双大括号,直至通过显式或隐式调用 ToString() 方法格式化字符串。 所有包含的内插表达式都转换为{0}, {1},依次类推。

    以下示例使用反射来显示内插字符串中所创建的 IFormattable 变量的成员以及字段和属性值。 并将 IFormattable 变量传递给 Console.WriteLine(String) 方法。

    VB复制

    Imports System.Globalization
    Imports System.Reflection
    
    Public Module Example
       Public Sub Main()
          Dim price = 1000
          Dim s2 As IFormattable = $"The cost of this item is {price:C}."  
          ShowInfo(s2)
          CultureInfo.CurrentCulture = New CultureInfo("en-US")
          Console.WriteLine(s2)
          CultureInfo.CurrentCulture = New CultureInfo("fr-FR")
          Console.WriteLine(s2)      
       End Sub
    
       Private Sub ShowInfo(obj As Object)
          Console.WriteLine($"Displaying member information:{vbCrLf}")
          Dim t = obj.GetType()
          Dim flags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.NonPublic
          For Each m In t.GetMembers(flags) 
             Console.Write($"   {m.Name} {m.MemberType}")   
             If m.MemberType = MemberTypes.Property Then
                Dim p = t.GetProperty(m.Name, flags)
                Console.Write($"   Value: {p.GetValue(obj)}")         
             End If
             If m.MemberType = MemberTypes.Field Then
                Dim f = t.GetField(m.Name, flags)
                Console.Write($"   Value: {f.GetValue(obj)}")
             End If
             Console.WriteLine()
          Next
          Console.WriteLine($"-------{vbCrLf}")
       End Sub
    End Module
    ' The example displays the following output:
    Displaying member information:
    
    '       get_Format Method
    '       GetArguments Method
    '       get_ArgumentCount Method
    '       GetArgument Method
    '       ToString Method
    '       System.IFormattable.ToString Method
    '       ToString Method
    '       Equals Method
    '       GetHashCode Method
    '       GetType Method
    '       Finalize Method
    '       MemberwiseClone Method
    '       .ctor Constructor
    '       Format Property   Value: The cost of this item is {0:C}.
    '       ArgumentCount Property   Value: 1
    '       _format Field   Value: The cost of this item is {0:C}.
    '       _arguments Field   Value: System.Object[]
    '       -------
    '
    '       The cost of this item is $1,000.00.
    '       The cost of this item is 1 000,00 €.
    ' </Snippet1>
    
    

    请注意,只能通过使用反射来检查内插字符串。 如果将其传递给字符串格式设置方法,例如 WriteLine(String),则会解析其格式项并返回结果字符串。

  3. 内插字符串转换为FormattableString表示复合格式字符串的变量。 例如,检查复合格式字符串及其呈现为结果字符串的方式可能有助于在生成查询时防止注入攻击。 一个FormattableString还包括:

    出现的所有双大括号 ("{{"和"}}") 仍保留为双大括号直至您设置的格式。 所有包含的内插表达式都转换为{0}, {1},依次类推。

    VB复制

    Imports System.Globalization
    
    Public Module Example
       Public Sub Main()
          Dim name = "Bartholomew"
          Dim s3 As FormattableString = $"Hello, {name}!"  
          Console.WriteLine($"String: '{s3.Format}'")
          Console.WriteLine($"Arguments: {s3.ArgumentCount}")
          Console.WriteLine($"Result string: {s3}")
       End Sub
    End Module
    ' The example displays the following output:
    '       String: 'Hello, {0}!'
    '       Arguments: 1
    '       Result string: Hello, Bartholomew!
    

?. 和?() null 条件运算符 (Visual Basic)

 

测试是否为空的左操作数的值 (Nothing) 之前执行成员访问 (?.) 或索引 (?()); 操作返回Nothing如果左操作数的计算结果为Nothing。 请注意,在表达式中通常会返回值类型,null 条件运算符返回Nullable<T>

这些运算符可帮助您编写更少代码来处理 null 检查,尤其是当下降到数据结构。 例如:

VB复制

Dim length As Integer? = customers?.Length  ' Nothing if customers is Nothing  
Dim first As Customer = customers?(0)  ' Nothing if customers is Nothing  
Dim count As Integer? = customers?(0)?.Orders?.Count()  ' Nothing if customers, the first customer, or Orders is Nothing  

有关比较,这些表达式而无需 null 条件运算符的第一个替代代码是:

VB复制

Dim length As Integer
If customers IsNot Nothing Then
   length = customers.Length
End If

NULL 条件运算符采用最小化求值策略。 如果条件成员访问和索引操作链中的一个操作不返回任何内容,将停止的链的执行其余部分。在以下示例中,如果 c (e) 不评估A, B,或C计算结果为 Nothing。

VB复制

A?.B?.C?(E);

Null 条件成员访问的另一个用途是在使用非常少的代码以线程安全的方式调用委托。 旧方法需要如下所示的代码:

VB复制

Dim handler = AddressOf(Me.PropertyChanged)  
If handler IsNot Nothing  
    Call handler(…)  

新的方法是要简单得多:

VB复制

PropertyChanged?.Invoke(…)

新方法是线程安全的,因为编译器生成的代码仅评估 PropertyChanged 一次,从而使结果保持在临时变量中。 你需要显式调用 Invoke 方法,因为不存在 NULL 条件委托调用语法 PropertyChanged?(e)

字符串基础 (Visual Basic)

 

String 数据类型表示一系列字符(每个字符都进而表示 Char 数据类型的一个实例)。 本主题介绍在 Visual Basic 中的字符串的基本概念。

字符串变量

可以向字符串的实例分配表示一系列字符的文本值。 例如:

VB复制

Dim MyString As String
MyString = "This is an example of the String data type"

String 变量还可以接受计算结果为字符串的任何表达式。 示例如下所示:

VB复制

Dim OneString As String
Dim TwoString As String
OneString = "one, two, three, four, five"
' Evaluates to "two".
TwoString = OneString.Substring(5, 3)
OneString = "1"
' Evaluates to "11".
TwoString = OneString & "1"

分配给 String 变量的任何文本都必须括在引号 ("") 内。 这意味着字符串中的引号不能使用引号进行表示。 例如,下面的代码会导致编译器错误:

VB复制

Dim myString As String

' This line would cause an error.
' myString = "He said, "Look at this example!""

此代码会导致错误,因为编译器会在第二个引号之后终止字符串,字符串的其余部分会解释为代码。 若要解决此问题,Visual Basic 会将字符串文本字符串中的一个引号中的两个引号解释。 下面的示例演示在字符串中包含引号的正确方法:

VB复制

' The value of myString is: He said, "Look at this example!"
myString = "He said, ""Look at this example!"""

在上面的示例中,字词 Look 前面的两个引号会成为字符串中的一个引号。 行尾的三个引号表示字符串中的一个引号和字符串终止符。

字符串可以包含多行:

VB复制

Dim x = "hello  
world"  

生成的字符串包含在字符串中使用的换行符序列(vbcr、vbcrlf 等)。 不再需要使用旧的解决方法:

VB复制

Dim x = <xml><![CDATA[Hello  
World]]></xml>.Value  

字符串中的字符

可以将字符串视为一系列 Char 值,String 类型具有内置函数,可用于对字符串执行很多操作(类似于数组允许的操作)。 与 .NET Framework 中的所有数组一样,这些是从零开始的数组。 还可以通过 Chars 属性引用字符串中的特定字符,该属性提供了一种方法,用于通过字符在字符串中出现的位置来访问它。 例如:

VB复制

Dim myString As String = "ABCDE"
Dim myChar As Char
' The value of myChar is "D".
myChar = myString.Chars(3)

在上面的示例中,字符串的 Chars 属性返回字符串中的第四个字符(即 D),并将它分配给 myChar。 还可以通过 Length 属性获取特定字符串的长度。 如果需要对字符串执行多个数组类型的操作,则可以使用字符串的 ToCharArray 函数将它转换为 Char 实例的数组。 例如:

VB复制

Dim myString As String = "abcdefghijklmnop"
Dim myArray As Char() = myString.ToCharArray

变量 myArray 现在包含 Char 值的数组,其中每个值都表示 myString 中的一个字符。

字符串的不可变性

字符串是不可变,这意味着不能一次更改其值创建。 但是,这不会阻止你将多个值分配给字符串变量。 请看下面的示例:

VB复制

Dim myString As String = "This string is immutable"
myString = "Or is it?"

这里会创建一个字符串变量(向它提供值),然后更改其值。

更具体地说,在第一行中,会创建类型 String 的实例,并提供值 This string is immutable。 在示例的第二个行中,会创建一个新实例并向它提供值 Or is it?,字符串变量会放弃它对第一个实例的引用,并存储对新实例的引用。

与其他内部数据类型不同,String 是引用类型。 当引用类型的变量作为参数传递给函数或子例程时,会传递对数据存储位置的内存地址的引用(而不是字符串的实际值)。 因此在上面的示例中,变量的名称保持不变,但它会指向 String 类的另一个新实例(该实例会保存新值)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值