I'm going to come out and say this right now. I strongly disadvise beginning with .NET.
This includes VB, C#, and Visual C++. Why? It's overwhelming and overmanaged. It is incredibly difficult to create truly optimized binaries through .NET, since a lot of things are included in the background that are out of you (the programmer's) scope of control.
Keep in mind that just because something is within Visual Studio doesn't mean it's going to be managed .NET stuff. You can certainly make unmanaged C#; you can make managed C++. It all depends on what you want to do, and Visual Studio will happily provide you the option to do exactly that. (Using unmanaged code in C# is a
very bad idea unless you really need to directly use some Win32 APIs.)
When it comes to optimization, keep in mind that Visual Basic .NET and C# are not designed to be competitive with unmanaged C++ when it comes to performance and memory requirements. Such is the overhead of having things managed for you. It
does make a programmer's life easier once one "gets" it, though.
Control is good as long as it is not easily misused. Unfortunately, in practice, all that control can end up being more than what you have bargained for! ;)
With VB, I'll go ahead and say that its entire structure is begging for syntax errors. It's what I began on, though, and I never really used it beyond creating an RTF editor though a tutorial. Keep in mind that VB does a lot of things differently than the C family.
BASIC isn't something you want to use for advanced stuff. That language is best for simpler stuff that doesn't rely on object-oriented programming (although you can push it if you want to), and it's
slow.
For first-time programmers and "just a side job" people, though, it's perfect.
Then, we have C# - what many people call the best of the best - is, like VB, managed. Arguments such as "C# has builtin strings", "C# has builtin class/namespace handling", and "C# doesn't screw with headers", are all good points if you don't mind sacrificing a huge chunk of control over the backend of your application. First, strings. In C, strings can be represented through char*, which is basically a dynamically allocated character array. By this logic char*s also double as char[]s, which means you can read each char individually and as a string without doing time-wasting type conversions—like in C#. Second, there's the argument over namespace and class handling. Albeit this is useful for handling incredibly large applications with libraries of DLLs, C++ also has this functionality. Also, don't you think it's a waste of space for some tiny command line app? In C++ you have the option to use these (although it gets very messy). Third, and finally, "C# doesn't screw with headers". Well, when you think of the purpose of header files in C(++), you know that they're there to enable calling methods from other code files, as well as defining type structures and preprocessor constants. Isn't it quite sacrificial to rely on the compiler to figure out what class files to link within a project? And don't you think it's a little redundant to have type structures cluttering up your code files? And not to mention C# doesn't support preprocessor-level defines. Bummer, isn't it?
To me, the way C-strings are handled are... horrendous compared to the C++ <string> library of C# strings. The less said about <cstring>, the better.
You wouldn't want to know how much of a kludge the C/C++ strings are for me. I'll be honest - I've never liked how strings are handled with the built-in libraries in C or C++, and my head spins every time I need to deal with strings. They don't really make things straightforward back then, and you can kind of tell C++, although powerful, is... a tangled mess. In some situations, I'd rather code in BASIC or C# than to do it in C++ if only because at least my head wouldn't spin and give me the equivalent of a BSoD.
Either way, you do have to think differently when you're coding in C# as opposed to C or C++, and that's one thing I can live with.
Third, there's C++. Considered by developers and corporations alike to be the one, C++ isn't exactly what you would call ideal—within Visual Studio, that is. When you scratch code C++ programs and compile them with GCC or MinGW, all is good; C++ works exactly how you want it - little or no confusion arises when creating projects. But with Visual Studio, a once powerful programming language gets neutered into an overdeveloped and overmanaged project solution, and that's where things get confusing.
Trying to "scratch code" large projects is asking for trouble; also, Visual Studio is not the only IDE in the world, either. Whether just writing the code on a text editor or utilizing an IDE is better depends on what you're working on.
There is one thing that's sort of funky about C++ itself, though, and that's how it handles defining prototypes for classes and namespaces. It can be incredibly confusing and difficult to understand exactly what each bit of text does for a class declaration in a header file, not to mention when defining access levels for classes also.
Certain things do seem to never change :)
Through all of this, I recommend starting with C. Not just any C or ANSI C, though; make sure you use C99. I'll explain why.
Pretty much everything is do-it-yourself. Through this method of programming, you don't have dozens or even hundreds of unwanted structure properties floating around in your program doing nothing (e.g. exampleString.Length that never gets used). Basically, C gives you all the tools, and you scratch-code your masterpiece.
...and ignore the provided libraries? When you realize that you need something more, you will need to figure out where to start.
Sometimes, you do not want to reinvent the wheel.
And C is simple; all of it's ins-and-outs are laid out in plain sight, no questions asked. Not only that, but with MinGW and GCC, you can compile C code into native binaries for almost any platform/architecture combination. That includes Intel, ARM, AMD, and most of their addressing derivatives (16-bit/32-bit for ARM, 32-bit/64-bit for Intel/AMD). Also, C was the first. C is one of the most powerful and robust languages available, and is specifically designed to be as clutter-free as possible.
On the other hand, new languages are designed for a reason ;)
C is a good language to begin on because (1) you can compile Windows natives right off the bat, (2) GCC and MinGW have verbose error handling at compile time, (3) C doesn't have hardly any unwanted clutter; everything ever used you declare yourself, and (4) it supports resource files and C++-styled (// ) comments (with C99), among other goodies.
(1) I'd agree.
(2) Verbose error handling is useless if the error messages are indecipherable. ;)
(3) There's a difference between "clutter" and "things you never notice until you need it and it's missing".
(4) I'd agree, too... but not that it really matters, huh?
P.S. You won't have to worry about making your users download 600 megabytes of packages just to get your application to run. :P
I suspect it's more like 50 MB at most on modern Windows systems for a single version of .NET Framework. Newer versions of Windows bundle newer versions of .NET Framework; if you're targeting Windows Phone, you don't even need to worry about this. (Some Windows Phone applications can be as small as a few dozen KB and still be useful!)
Besides, the same .NET Framework installation can be used for a lot of other things, too.