Skip to main content

Optional Parameters in C#

C# 4.0 has a nice feature of creating methods with optional parameters which allows caller to pass only required parameters and not all. This is particular helpful in methods which needs a lot of parameters.


Method with optional parameters :



Out put :15

Here caller is only passing one parameter i.e. 5 and output is 15 because default value for parameter b is used which is 3.

but, care should be taken when you create methods with optional parameters in a library which is used by third party application (where you have less control) because by just changing the default value in the library , if this new library is deployed (with every thing as it is),  client apps will NOT see the change. Client application also needs to be re-compiled with the updated library to see the changes because of the new default value. 

in the above example , if OptionalParam.exe uses  updated library.dll (without recompiling the complete solution ) where default value of b has been changed from 3 to 4, out put will still be 15. 

strange !!!  here is the reason. 

when compiler compiles the solution and it identifies a call to method with optional parameters, and if optional parameters are not passed by caller, compiler passes the default value of those optional parameters to callee.  so changing the values of optional params inside the called method won't have any effect since this will be overridden by passed values. 


this is the IL code for library.dll which has a method with optional parameters















This is IL code for Main method . If you see IL_0006 and IL_0007, compiler is passing arguments to the methods in the library.dll.  Here IL_0006:ldc.i4.5 pushes 5 on stack . This parameter has been passed by caller. 
IL_0007:ldc.i4.3 pushes 3 onto stack. This is second parameter to the method which is optional and NOT passed in the code. but compiler passes this default values in the absence of any value for optional parameter.

This explains that by just updating the dll and not recompiling the solution which references the dll will not see the effect of any change in the default value. 

Comments

Popular posts from this blog

The view or its master was not found or no view engine supports the searched locations!!!

On an MVC application, if you are getting error " The view or its master was not found or no view engine supports the searched locations " and you see that this view (.cshtml file)is already present under the correct folder structure and every thing is correct and you have also tried a lot of posts on SO on how to fix that and that hasn't helped,  just check the build action for this file and make sure that it is set to "content". I have seen the build action set to None (by mistake)and after you deploy/publish  the application, that view would be missing  and you get this error .

Know where to patch!!!

Have you tried to patch a function call in your unit test and wondering why the hell patching is not working, value I'm returning from the patched function is not the value being used in the function call. Well, may be you are not patching at the right place. I saw this problem at work. I'll try to explain with a simple example. you have a module module_a which has a function greet. There is another module module_b which uses this function from module_a in another function - sayHi . When we write test case for module_b's sayHi, we want to patch function call to module_a's greet method. module_a.py def greet (): """ returns sum of two numbers""" return 'hello world' module_b.py from module_a import greet class myClass (): def sayHi ( self ): return greet() if __name__ == '__main__' : res = myClass().sayHi() print (res) test_mod_b.py import un

Top Tweets

FSharp (5th Sept 2013) when I search for F# tweets , there are so many duplicate tweets and people are having conversation with F# hashtag. I'm not really interested in conversation , but want to check what cool stuff has been shared about F#. so wrote a simple script which searches twitter for F# hashtag, removes duplicate tweets and tweets having conversation. Here is the result- New F# Cheatsheet in PDF and HTML format using FSharp.Formatting tool http://t.co/iczl1Ge3Hz #fsharp F# Snippet: Missile Command playable in tsunami.io http://t.co/BiLQxCykJa #fsharp Building a game in a day with #fsharp & #monogame slides & code samples: http://t.co/8eX64NsqOl #fsharp #mongodb provider meetup w/ @visemet starting in 15 minutes or so - you can join us online here. https://t.co/o8egTRDAn7 Awesome custom #fsharp query support for #mongodb by @visemet! http://t.co/hJQDNhyNSt #fsharp #mongodb provider meetup w/ @visemet starting in 15 minutes or so -