Skip to content

WITH


允许隐式访问用户自定义类型变量中字段的语句块

语法

vb
With user_defined_var

statements

End With

描述

With...End With 块允许在引用用户自定义 Type 变量的字段时省略变量名。字段可以通过在其前面加上一个句点(.)来访问,例如,如果 Type 包含名为 "element" 的字段元素,则可以在 With 块内以 ".element" 的方式访问。

它可以用作节省输入并避免代码混乱的简写形式。

With 也可以与解引用指针一起使用(如第二个示例所示),与临时实例(具有显式或隐式构造函数)一起使用(如第三个示例所示),甚至与临时类型(没有任何构造函数)一起使用,因为此类临时实例/类型的析构被推迟到 With 作用域结束。

但不支持将临时实例/类型作为参数的函数的按引用返回(且无错误消息)。

With 块可以嵌套。在这种情况下,只有最内层的 With 块是活动的,任何外层的块将被忽略,直到内层块再次关闭。请参见第三个示例以了解说明。

在内部,变量的地址在 With 块开始时获取,然后用于计算块内任何元素的访问。

请注意,这意味着不应使用 Goto 跳入 With 块,否则地址将未被设置,尝试访问它的结果将是未定义的。

*关于在成员过程中使用 With 块的注意事项:

要访问在 Type 外部定义为全局的重复符号,请添加两个点作为前缀:"..SomeSymbol"(在 With...End With 块内)。*

示例

start GeSHi

vb
Type rect_type
    x As Single
    y As Single
End Type

Dim the_rectangle As rect_type
Dim As Integer temp, t

With the_rectangle
    temp = .x
    .x = 234 * t + 48 + .y
    .y = 321 * t + 2
End With

end GeSHi

start GeSHi

vb
Type rect_type
    x As Single
    y As Single
End Type

Dim the_rectangle As rect_type Ptr

the_rectangle = CAllocate( 5 * Len( rect_type ) )

Dim As Integer loopvar, temp, t

For loopvar = 0 To 4

  With the_rectangle[loopvar]  '' 解引用指针

    temp = .x
    .x = 234 * t + 48 + .y
    .y = 321 * t + 2

  End With

Next

end GeSHi

start GeSHi

vb
Type rect_type
    x As Single
    y As Single
    Declare Constructor()
    Declare Constructor(ByVal x0 As Single, ByVal y0 As Single)
End Type

Constructor rect_type()
End Constructor

Constructor rect_type(ByVal x0 As Single, ByVal y0 As Single)
    This.x = x0
    This.y = y0
End Constructor

Dim the_rectangle As rect_type

With rect_type(1, 2)  '' 在此创建临时实例,保持到 'End With'
    the_rectangle.x = .x + .y  '' 1 + 2 = 3
    the_rectangle.y = .x - .y  '' 1 - 2 = -1
End With

end GeSHi

start GeSHi

vb
Type rect_type
    x As Single
    y As Single
End Type

Dim As rect_type rect1, rect2

'' 嵌套 With 块
With rect1

    .x = 1
    .y = 2

    With rect2

        .x = 3
        .y = 4

    End With

End With

Print rect1.x, rect1.y '' 1,  2
Print rect2.x, rect2.y '' 3,  4

end GeSHi

版本

  • 在 fbc 1.10.0 之前,不支持临时类型(没有任何构造函数)(因为此类临时类型的析构在 With 语句之后立即调用)。

方言差异

  • -lang qb 方言中不可用,除非使用别名 __With 引用。
  • -lang qb-lang fblite 方言中,With..End With 块内声明的变量与 QB 一样具有函数级作用域
  • -lang fb-lang deprecated 方言中,With..End With 块内声明的变量仅在块内可见,无法在块外访问。

与 QB 的区别

  • FreeBASIC 新增

参见

  • Type

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系