Tuesday, 17 February 2015

How to Make a Method Parameter Optional


Four ways to making a method parameter optional
1. Use parameter arrays
Let's say we have a console application project in which we need to create a method that can add two or more numbers, meaning there is no limit on how many values a user will pass. For example, if a user wants to add 50 different numbers, your method should be capable of doing so and on the other hand, if the user wants to add only two numbers, your method should be capable of doing that too.

So, let's see how to implement that kind of method.

Currently my console application looks like this.

main method

Let's a create method that will add two numbers.

create method

We have created a static method “Add” that has two parameters, FN and SN. Both of these parameters are of type integer.

Inside this method, we have declared a new variable “sum” in which the sum of FN and SN will be stored. Then we are printing the result on the console screen.

Currently it looks like our method is only able to add two numbers and the user with that requirement is happy. But there is another user who wants to add 5 numbers and to make that user satisfied we need to make some changes in our method.

changes in our method

We have added a third parameter of type params int[].

This parameter can hold an array of numbers and to retrieve all the values from an array we can use a foreach loop.

Using a foreach loop we are assigning all the values from MoreNumbers in numbers and inside this loop we are adding all the numbers one by one with the current sum and in the end we are printing the number on the console window.

So, we have created our method that can add two numbers and more than two numbers.

The next step is to invoke this method in our Main method and since it is a static method we can invoke this method by just calling the name of the class like this.
  1. ClassName.MethodName();  
Pass each value separated by commas.

Pass each value

Run the application
Run

And if the user wants to add only two numbers:

add only two number

We haven't specified any values for the third parameter and even after this if you compile and run the application, it will not give us any error because of the params keyword.

params

Now, if we don't specify any value, the third parameter does not count since params[] are optional but what will happen if we pass null?

parameter

Run the application
We will get an exception.

exception

So, it is always a good practice to check whether params[] is null or not and for that before looping thru the numbers we need to check if MoreNumbers is null or not.

MoreNumbers

If you run the application now, you will not get an exception.

Note

Params array must be the last parameter in a parameter list.

2. Method Overloading
To make a parameter optional, we can use method overloading. Using method overloading, we can create several methods with the same name but with a different method signature.

So, first let's create a method in which the user can pass n numbers.

pass n numbers

The preceding code is the same as what we have seen in the params int[] demo.

In the main method, we can invoke this method directly by calling its class because this method is static and we don't need to create an instance of the class where this method is present.

present

Run the application
Run the application

Now, what will happen if I remove the third parameter argument from the Add method?

remove the third parameter

We will get a compile time error because there is no overload that takes two arguments in this method. But what we can do is we can pass null in the third parameter.

compile time error

If we run the application, we will get the sum of the two numbers.

application

But does this make the parameter optional?

No. Because, to make this method work we passed null for the third parameter and to overcome this problem we can create another overloaded version of this “Add” that takes two parameters.

Add

Now, if we invoke the Add method in our main method, it will give us the suggestion of the two overloaded versions of it.

Add method in our main method

overloaded

So, it now satisfies the user's requirements and based on that they will choose from the two overloaded versions of the Add method.

3. By specifying parameter defaults
The third way to make a parameter optional is by specifying parameter defaults.

Currently in my project, I have this Add method that expects three arguments.

arguments

To add n numbers, the preceding method works perfectly. But if we pass only FN and SN values it gives us the compile time error.

compile 

The reason for this error is, our Add method does not provide an overload version where we can specify values for two parameters and to make this method work we need to assign null for the third parameter that we saw in method overloading.

But there is another way to do the same thing by specifying parameter defaults. If you want to make a parameter optional, then specify a default value for that parameter.

specifying parameter

In the preceding image, we have passed null as a default value for the third parameter.

Note
You can pass any default value.

An optional parameter must appear after all the required parameters.

In the main method, pass the arguments for the first two parameters.

Pass arguments

Run the application
Run application

What if a user wants to add more than two numbers and he/she wants to pass those values in the third parameter? So, is it possible to pass any values for that parameter? Because currently we have specified null for it.

Yes. The user can pass the values for the third parameter.

third parameter

Run the application

console

Named Parameters
Let's look at another example where Named parameters can be used.

In my demo I have three parameters in a static method “Add”. Out of these three parameters the last two parameters are optional since we have specified default values for it.

default values

Invoke this method in your main method and pass value only for the first parameter.

pass value

Run the application


Invoke this method

Now, let's pass the value for the second parameter too.

output

Run the application
run program

Now what if I don't want this value of 2 for the second parameter, but I want this value for the third parameter. How is it possible to do this?

If we pass null for the second parameter, we will get an error.

get an error

If you look at the order we pass the parameters, first we pass a value for the first parameter, then the second parameter and then the third parameter.

order

In this kind of situation we can use named parameters.

Named parameter means name of the parameter. In our Add method, the name of the third parameter is TN. So, in order to pass the value 2 for this parameter we can say TN:2 where TN is the parameter name and 2 is the value.

third parameter is TN

Run the application

cmd

4. By using OptionalAttribute
Currently in my project, I have this Add method that expects three arguments and all these parameters are mandatory.

cs code

The preceding method is the same as what we saw in the last two ways of making a parameter optional.

To add n numbers, the preceding method works perfectly. But if we pass only FN and SN values it give us the compile time error.

method works perfectly

The reason for this error is, our Add method does not provide an overloaded version where we can specify values for two parameters and to make this method work we need to assign null for the third parameter.

To make the third parameter null, we can use OptionalAttribute that is present in the System.Runtime.InteropServices namespace.

Make the third parameter optional.

code

Assign the values for the first two parameters.

Assign the values

Run the application

result

But we can also pass the values for the third parameter.

pass the values for the third parameter

Run the application

program output

In this article we saw four ways to make a parameter optional and we have also seen the advantage of using Named Parameters.

Thank you.

No comments:

Post a Comment