I was thinking about writing a post about how C# is morphing into SQL because I noticed that C# has added named and optional arguments. Remember the Compound Operators Or How T-SQL Is Morphing Into VB Or C#? This is basically the same kind of thing only it goes into the other direction.

For some bizarre reason Chrissie had the same idea yesterday and posted the following post: What so special about Optional/named parameters. From that article you will learn that VB already had this back in the vb4 days.

So let’s get started. First the SQL Server version

Create the following stored procedure which has 3 optional parameters

create procedure OptionalTest
@Param1 varchar(10),
@Param2 varchar(10) = 'Two',
@Param3 varchar(10) = 'Three',
@Param4 varchar(10) = NULL

as
begin
	print '@Param1  = ' + @Param1
	print '@Param2  = ' + @Param2
	print '@Param3  = ' + @Param3
	print '@Param4  = ' + coalesce(@Param4,'')
end

Execute it with just the first parameter

exec OptionalTest 'bla'

Here is the output

@Param1 = bla

@Param2 = Two

@Param3 = Three

@Param4 =

When executing it with values for the first two parameters the output for the 2nd parameter changes

exec OptionalTest 'bla' ,'Twelve'

@Param1 = bla

@Param2 = Twelve

@Param3 = Three

@Param4 =

When executing with three parameters the third value changes

exec OptionalTest 'bla' ,'Twelve','Thirsty'

@Param1 = bla

@Param2 = Twelve

@Param3 = Thirsty

@Param4 =

And with four parameters all the values that are passed in are printed

exec OptionalTest 'bla' ,'Twelve','Thirsty','Forty'

@Param1 = bla

@Param2 = Twelve

@Param3 = Thirsty

@Param4 = Forty

If we pass in the first parameter and we olso want to pass in the third parameter we need to use named parameters, in this case we do this @Param3 = ‘Thirsty’

exec OptionalTest 'bla' ,@Param3 = 'Thirsty'

@Param1 = bla

@Param2 = Two

@Param3 = Thirsty

@Param4 =

If you want to pass in the first and the fourt parameter then you need to name the fourth one

exec OptionalTest 'bla' ,@Param4 = 'Thirsty'

@Param1 = bla

@Param2 = Two

@Param3 = Three

@Param4 = Thirsty

Omitting parameters won’t run or parse for that matter

exec OptionalTest 'bla' ,,,'Thirsty'

Server: Msg 102, Level 15, State 1, Line 1

Incorrect syntax near ‘,’.

You can use nulls but as you can see from the output nothing gets printed at all for paraeter 2 or 3, this is because when you concatenate a NULL value with something else you get nothing back

exec OptionalTest 'bla' ,null,null,'Thirsty'

@Param1 = bla

@Param4 = Thirsty

Now we can take a look at the c# version, the c# version is almost identical except that the first parameter is optional where this is not the case with the proc

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine("p.OptionalTest(bla);");
            p.OptionalTest("bla");

            Console.WriteLine("p.OptionalTest(bla,twelve)");
            p.OptionalTest("bla","Twelve");

            Console.WriteLine("p.OptionalTest(bla,twelve,Thirsty)");
            p.OptionalTest("bla", "Twelve","Thirsty");

            Console.WriteLine("p.OptionalTest(bla,twelve,Thirsty,Forty)");
            p.OptionalTest("bla", "Twelve", "Thirsty","Forty");

            Console.WriteLine("p.OptionalTest(bla,param3:Thirsty)");
            p.OptionalTest("bla", "Twelve", param3: "Thirsty");

            Console.WriteLine("p.OptionalTest(bla,param4:Thirsty)");
            p.OptionalTest("bla", "Twelve", param4: "Thirsty");

            //p.OptionalTest("bla", ,, "Thirsty");
            //argument missing won't compile

            Console.WriteLine("p.OptionalTest(bla,null,null,Thirsty)");
            p.OptionalTest("bla",null,null, "Thirsty");
            Console.ReadLine();

            
        }

        public int OptionalTest(string param1 = "2", string param2 = "two", string param3 = "three", string param4 = null)
        {
            Console.WriteLine("param1 = " + param1);
            Console.WriteLine("param2 = " + param2);
            Console.WriteLine("param3 = " + param3);
            Console.WriteLine("param4 = " + param4);
            Console.WriteLine("nr");
            return 0;
        }
    }
}

Here is the output from those calls

p.OptionalTest(“bla”);

param1 = bla

param2 = two

param3 = three

param4 =

p.OptionalTest(“bla”,“twelve”)

param1 = bla

param2 = Twelve

param3 = three

param4 =

p.OptionalTest(“bla”,“twelve”,“Thirsty”)

param1 = bla

param2 = Twelve

param3 = Thirsty

param4 =

p.OptionalTest(“bla”,“twelve”,“Thirsty”,“Forty”)

param1 = bla

param2 = Twelve

param3 = Thirsty

param4 = Forty

p.OptionalTest(“bla”,param3:“Thirsty”)

param1 = bla

param2 = Twelve

param3 = Thirsty

param4 =

p.OptionalTest(“bla”,param4:“Thirsty”)

param1 = bla

param2 = Twelve

param3 = three

param4 = Thirsty

p.OptionalTest(“bla”,null,null,“Thirsty”)

param1 = bla

param2 =

param3 =

param4 = Thirsty

As you can see there is almost no difference between SQL and C# when calling with named parameters

exec OptionalTest ‘bla’ ,@Param4 = ‘Thirsty’

p.OptionalTest(“bla”,param4:“Thirsty”)

Now you might ask yourself why do we need this? Have you ever called Office COM components? Here is what you would do now

word.Documents.Add()

instead of this

word.Documents.Add(ref oTemplate, ref missing, ref missing, ref
isVisible);

Some of these things might take up to 50 parameters and most of them might be optional, in a case like that optional and named parameters are great!!

If you want to watch a bunch of videos about Visual Studio 2010 then check out the following link: Learn Visual Studio 2010 now by watching these videos In that post I have collected over 20 videos that will help you learn the new stuff in Visual Studio 2010 and the .NET framework 4.0

If you want to learn more about c# 4.0 check out the following video with Anders Hejlsberg

http://channel9.msdn.com/posts/VisualStudio/C-40-Questions-and-reasons-behind-the-answers/

Also worthwhile C# 4.0 support for covariance and contravariance and New C# 4.0 Features Paper