If you create a procedure that takes one or more
arguments, whenever you call that procedure, you must provide a value for the argument(s). Otherwise,, you would receive an error.
If such an argument is passed with the same value over and over again, you
may be tempted to remove the argument altogether. In some cases, although
a certain argument is passed with the same value most of the time, you
still have situations in which you want the user to decide whether to pass
a value or not for the argument, you can declare the value optional. In
other words, you can create the argument with a default value so that the
user can call the procedure without passing a value for the argument, thus
passing a value only when necessary. Such an argument is called default or
optional.
Imagine you write a procedure that will be used to
calculate the final price of an item after discount. The procedure would
need the discount rate in order to perform the calculation. Such a
procedure could look like this:
Module Module1
Function CalculateNetPrice(ByVal DiscountRate As Double) As Double
Dim OrigPrice As Double
Console.Write("Please enter the original price: ")
OrigPrice = Console.ReadLine()
Return OrigPrice - (OrigPrice * DiscountRate / 100)
End Function
End Module
Since this procedure expects an argument, if you do not
supply it, the following program would not compile:
Module Module1
Function CalculateNetPrice(ByVal DiscountRate As Double) As Double
Dim OrigPrice As Double
Console.Write("Please enter the original price: ")
OrigPrice = Console.ReadLine()
Return OrigPrice - (OrigPrice * DiscountRate / 100)
End Function
Sub Main()
Dim FinalPrice As Double
Dim Discount As Double = 15 ' That is 25% = 25
FinalPrice = CalculateNetPrice(Discount)
Console.WriteLine("Final Price = {0}", FinalPrice)
End Sub
End Module
Most of the time, a procedure such as ours would use
the same discount rate over and over again. Therefore, instead of
supplying an argument all the time, you can define an argument
whose value would be used whenever the function is not provided with the
argument.
To specify that an argument is optional, when creating
its procedure, type the Optional keyword to the left of the
argument's name and assign it the default value. Here is an example:
Module Module1
Function CalculateNetPrice(Optional ByVal DiscountRate As Double = 20) As Double
Dim OrigPrice As Double
Console.Write("Please enter the original price: ")
OrigPrice = Console.ReadLine()
Return OrigPrice - (OrigPrice * DiscountRate / 100)
End Function
Sub Main()
Dim FinalPrice As Double
FinalPrice = CalculateNetPrice()
Console.WriteLine("Final Price = {0}", FinalPrice)
End Sub
End Module
If a procedure takes more than one argument, you can
provide a default argument for each and select which ones would have
default values. If you want all arguments to have default values, when
defining the procedure , provide the Optional keyword for each and assign
it the desired default value. Here is an example:
Module Module1
Function CalculateNetPrice(Optional ByVal Tax As Double = 5.75, _
Optional ByVal Discount As Double = 25, _
Optional ByVal OrigPrice As Double = 245.55) As Double
Dim DiscountValue As Double = OrigPrice * Discount / 100
Dim TaxValue As Double = Tax / 100
Dim NetPrice As Double = OrigPrice - DiscountValue + TaxValue
Console.WriteLine("Original Price: {0:C}", OrigPrice)
Console.WriteLine("Discount Rate: {0}%", Discount)
Console.WriteLine("Tax Amount: {0:C}", Tax)
Return NetPrice
End Function
Sub Main()
Dim FinalPrice As Double
FinalPrice = CalculateNetPrice()
Console.WriteLine("Final Price: {0:C}", FinalPrice)
End Sub
End Module
This would produce:
Original Price: $245.55
Discount Rate: 25%
Tax Amount: $5.75
Final Price: $184.22
If a procedure takes more than one argument as above,
remember that some arguments can be specified as optional. In this case,
when calling the procedure, any argument that doesn't have a default value
must be passed with a value. When creating a procedure that takes more
than one argument, the argument(s) that has(have) default value(s) must be
the last in the procedure. This means that, if a procedure takes two
arguments and one argument has a default value, this optional argument
must be the second. If a procedure is taking three or more arguments and
two or more arguments have default values, these optional arguments must
by placed to the right of the non-optional argument(s). Because of this,
when calling any procedure in VBasic, you must know what, if any, argument
is optional and which one is not.
If a procedure takes two arguments and one argument
has a default value, when calling this procedure, you can pass only one
value. In this case, the passed value would be applied on the first
argument. If a procedure takes more than two arguments and tow or more
arguments have a default value, when calling this procedure, you can
provide only the value(s) of the argument that is (are) not optional. If
you want to provide the value of one of the arguments but that argument if
not the first optional, you can leave empty the position(s) of the other
argument(s) but remember to type a comma to indicate that the position is
that of an argument that has a default value. Here is an example:
Module Module1
Function CalculateNetPrice(ByVal AcquiredPrice As Double, _
ByVal MarkedPrice As Double, _
Optional ByVal TaxRate As Double = 5.75, _
Optional ByVal DiscountRate As Double = 25) As Double
Dim DiscountAmount As Double = MarkedPrice * DiscountRate / 100
Dim TaxAmount As Double = MarkedPrice * TaxRate / 100
Dim NetPrice As Double = MarkedPrice - DiscountAmount + TaxAmount
Console.WriteLine("Price Acquired: {0:C}", AcquiredPrice)
Console.WriteLine("Marked Price: {0:C}", MarkedPrice)
Console.WriteLine("Discount Rate: {0}%", DiscountRate)
Console.WriteLine("Discount Amt: {0:C}", DiscountAmount)
Console.WriteLine("Tax Rate: {0}%", TaxRate)
Console.WriteLine("Tax Amount: {0:C}", TaxAmount)
Return NetPrice
End Function
Sub Main()
Dim FinalPrice As Double
FinalPrice = CalculateNetPrice(225.55, 150.55, , 40)
Console.WriteLine("Final Price: {0:C}", FinalPrice)
End Sub
End Module
This would produce:
Price Acquired: $225.55
Marked Price: $150.55
Discount Rate: 40%
Discount Amt: $60.22
Tax Rate: 5.75%
Tax Amount: $8.66
Final Price: $98.99
|