WITH
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgWith
- 最后更新: 2023-03-05
允许隐式访问用户自定义类型变量中字段的语句块
语法
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 Withend 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
Nextend 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 Withend 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, 4end 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
返回 目录