Mon, May 30, 2005, 09:58 AM under 
dotNET
   
  
    As you know, in VB variables do not need to be initialised, as they always get the default value for the variable type in question, e.g. 
Dim b As Boolean 'b is already initialised to FalseIn C-based languages (inc. C#) this does not apply; you must initialise the variable before you use it, e.g. 
bool b = false;The above is the reason we cannot have 
ByOut in VB (only 
ByVal and 
ByRef) whereas C# has both 
ref and 
out (
ByVal is implied by omission).
I have seen VB code that follows the C-style and there are two common reasons for doing so; one is to be explicit and the other is because of a C-based upbringing. The question is what IL will the VB compiler generate, faced with code that differs only by explicit assignment (we know it is pretty 
crap at optimising the simplest of scenarios, so we don't go in with our hopes high).
Given these two methods (and assuming a private method 
GetNumber):
    Public Sub VBStyle()
        Dim i As Int32
        i = GetANumber()
    End Sub
    Public Sub CsStyle()
        Dim i As Int32 = 0
        i = GetANumber()
    End Sub
I can tell you that the VB compiler generates slower code for the second scenario 
(I have to say if you have a bottleneck in your project, cases like this will not be it, but it is still good to know :-).
Here is the corresponding IL:
.method public instance void  VBStyle() cil managed
{
  // Code size       8 (0x8)
  .maxstack  1
  .locals init ([0] int32 i)
  IL_0000:  ldarg.0
  IL_0001:  callvirt   instance int32 VBWinApp.Class3::GetANumber()
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method Class3::VBStyle
.method public instance void  CsStyle() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] int32 i)
  IL_0000:  ldc.i4.0
  IL_0001:  stloc.0
  IL_0002:  ldarg.0
  IL_0003:  callvirt   instance int32 VBWinApp.Class3::GetANumber()
  IL_0008:  stloc.0
  IL_0009:  ret
} // end of method Class3::CsStyle
Needless to say that the C# version closely reflects the first version (it is even better, since it uses a 
call rather than a 
callvirt - but that is a different story...).