Let us discuss it in depth with a simple example. First start with the Optional Parameter. Suppose you are creating an Calculator application where you have to do some "Add" operation by passing two, three or four parameters to the method. What will you do if you are using C# 2.0 or 3.0? You will have no other choice than creating as many methods and passing the parameters in this which is known as method overloading.
public int Add(int a, int b);
public int Add(int a, int b, int c);
public int Add(int a, int b, int c, int d);
If you are using C# 4.0 just forget about method overloading by using the optional parameter. Optional parameter is a default value passes to the method signature. Let us go for modifying our previous example to use optional parameter.
public int Add(int a, int b, int c = 0, int d = 0);
Here we are passing default value to the parameter "c" and "d". Hence you can call this method as per your requirement like this:
Add(10, 20); // 10 + 20 + 0 + 0
Add(10, 20, 30); // 10 + 20 + 30 + 0
Add(10, 20, 30, 40); // 10 + 20 + 30 + 40
In the first case it will pass '0' (zero) as the optional parameter c and d, in the second case the fourth parameter will be treated as '0' (zero) and in the third case all the parameters are available with proper values.
Now, let us think that we have a situation where we are creating an account of an user with the method named "CreateAccount" which has a non-optional parameter "Name" and two optional parameters "Address" & "Age". Here in some scenario you want to pass only the "Name" and "Age", how can you pass? Just think on it.
public void CreateAccount(string name, string address = "unknown", int age = 0);
Are you thinking of calling the method with an empty string or null value to the "Address" parameter? Oh, not really. There comes the another new feature of C# 4.0 called as "Named Parameter". Using this you can call the method with proper name resolution or even you can change the position of the parameter while calling the method. Have a look into the following code example:
CreateAccount("Kunal", age: 28);
CreateAccount(address: "India", name: "Kunal");
First example shows calling the method without the middle parameter "Address" and the second example demonstrates calling the same method after changing the position of the parameter in the parameter list using the name of the parameter.