I've never used VB.net, so I can only tell you what it did in prior versions. Declaring a variable as New Object causes an object of type Object to be created. The difference between
Dim myObj as oFoo
and
Dim myObj as New oFoo
was that in the first example, a reference was created to a instance of oFoo, but the object itself was not created and therefore any initialization code doesn't happen. The object wouldn't actually be created until the first usage of myObj in the function. The second example caused the item to be instantiated, and any code that ran at object creation would occur at declaration.
It's a minor difference, and often unnoticeable, but you do have to realize what's going on. Here's some pseudo-code to illustrate the difference:
Function myFunction
Dim myObj as oFoo
If lGlobalFooCounter > 0 Then Exit Function
myObj.DoYourThing
End Function
Object oFoo
Initialize
lGlobalFooCounter = lGlobalFooCounter + 1
End Initialize
Function DoYourThing
EndFunction
End Object
Ignoring the fact that this is horrible logic and design to begin with... not using the New keyword can cause issues. The initialization of oFoo increments a global counter. Without the New keyword, the object is not being initialized until after the counter has been checked in the function which creates an instance of oFoo. If for some reason you could only allow a single oFoo, perhaps it's using a file locked mode, this function would fail. If the New keyword had been used, the object would have been initialized at declaration, which would have incremented the counter such that checking the global would properly reflect the number of oFoo objects in use.
I hope this made sense. I just pulled an all nighter and I'm starting to drift off.