FreeBasic With/End With Keywords
last modified June 16, 2025
The FreeBasic With/End With construct provides a shorthand way
to access multiple members of an object or type. It reduces repetitive code
when working with complex structures.
Basic Definition
The With statement in FreeBasic allows you to specify an object
reference once, then access multiple members without repeating the object
name. The block ends with End With.
This construct improves code readability and can make programs slightly more efficient by reducing repeated object lookups. It's particularly useful when working with structures or objects that have many members.
Basic With/End With Usage
This example demonstrates the simplest use of With/End With with a structure.
Type Point
x As Integer
y As Integer
End Type
Dim p As Point
With p
.x = 10
.y = 20
End With
Print "Point coordinates: "; p.x; ","; p.y
Here we create a Point structure and use With to set its x and y members.
Instead of writing p.x and p.y, we use .x
and .y inside the With block. The dot prefix refers to the p object.
With Block for Multiple Operations
With blocks are especially useful when performing several operations on an object.
Type Rectangle
x As Integer
y As Integer
width As Integer
height As Integer
End Type
Dim rect As Rectangle
With rect
.x = 5
.y = 5
.width = 100
.height = 50
Print "Area: "; .width * .height
End With
This example shows how With can clean up code when working with objects that require multiple property assignments. We set four properties and calculate the area, all without repeating the rect variable name.
Nested With Statements
FreeBasic allows nesting With statements to work with hierarchical structures.
Type Address
street As String
city As String
End Type
Type Person
name As String
home As Address
End Type
Dim person As Person
With person
.name = "John Doe"
With .home
.street = "123 Main St"
.city = "Springfield"
End With
End With
Print person.name; " lives at "; person.home.street; ", "; person.home.city
Here we nest With blocks to access properties at different levels. The outer With handles the Person object, while the inner With works with its Address sub-object. This makes hierarchical data access cleaner.
With and Arrays
With blocks can be used with array elements for concise array manipulation.
Type Player
name As String
score As Integer
End Type
Dim players(1 To 3) As Player
With players(2)
.name = "Alice"
.score = 850
End With
Print "Player 2: "; players(2).name; " - Score: "; players(2).score
This example demonstrates using With with an array element. We access the second player in the array and set its properties without repeating the array index. The code remains clear even with array indexing.
With and Function Calls
With blocks can contain function calls that operate on the current object.
Type Circle
x As Integer
y As Integer
radius As Integer
End Type
Function Area(c As Circle) As Double
Return 3.14159 * c.radius * c.radius
End Function
Dim circ As Circle
With circ
.x = 50
.y = 50
.radius = 10
Print "Circle area: "; Area(circ)
End With
Here we use a With block to set up a Circle object and then call a function that operates on it. The function call appears within the With block, though it still needs the full object reference as a parameter.
With and Method Chaining
With blocks can make method chaining more readable in object-oriented code.
Type StringBuilder
buffer As String
Declare Sub Append(s As String)
Declare Sub Clear()
Declare Function ToString() As String
End Type
Sub StringBuilder.Append(s As String)
This.buffer += s
End Sub
Sub StringBuilder.Clear()
This.buffer = ""
End Sub
Function StringBuilder.ToString() As String
Return This.buffer
End Function
Dim sb As StringBuilder
With sb
.Clear()
.Append("Hello")
.Append(" ")
.Append("World")
Print .ToString()
End With
This example shows how With can improve readability when calling multiple methods on an object. Instead of prefixing each method with sb, we use the With block to establish the context once.
With and Complex Expressions
With blocks can contain complex expressions involving the current object.
Type Vector
x As Double
y As Double
Declare Function Magnitude() As Double
End Type
Function Vector.Magnitude() As Double
Return Sqr(This.x * This.x + This.y * This.y)
End Function
Dim v As Vector
With v
.x = 3.0
.y = 4.0
Print "Magnitude: "; .Magnitude()
Print "Normalized x: "; .x / .Magnitude()
Print "Normalized y: "; .y / .Magnitude()
End With
Here we use a With block to perform multiple calculations involving a Vector object. The block contains method calls and mathematical operations, all referencing the vector's properties with the shorthand dot notation.
Best Practices
- Scope: Keep With blocks reasonably short for readability.
- Nesting: Limit nested With blocks to avoid confusion.
- Clarity: Use With when it genuinely improves code clarity.
- Variables: Don't mix With blocks with similarly named variables.
- Performance: Use With for readability, not just optimization.
This tutorial covered the FreeBasic With/End With construct with
practical examples showing its usage in different scenarios.
Author
List all FreeBasic Tutorials.