Comparison of C Sharp and Visual Basic
Comparison of C Sharp and Visual Basic
NET
From Wikipedia, the free encyclopedia
C# and Visual Basic are the two primary languages used to program on the .NET Framework.
Language history
C# and VB.NET are syntactically very different languages with very different history. As the
name suggests, the C# syntax is based on the core C language originally developed by Bell Labs
(AT&T) in the 1970s [1] and eventually evolved into the fully object oriented C++ language still
in use today. Much of the Java syntax is also based on this same C++ language,[2] which is one of
the reasons the two share a common look and feel. See Comparison of Java and C Sharp for
more on this topic.
VB.NET has its roots in the BASIC language of the '60s with its name being an acronym for
"Beginner's All-purpose Symbolic Instruction Code". In its beginning, BASIC was used in the
college community as a "basic" language for first exposure to computer programming and the
acronym represented the language accurately.[3] In the '70s, the language was picked up by
microcomputer manufacturers of the era to be used as both a simple ROM embedded
programming language as well as a quasi operating system for input/output control.[4] In the early
'80s, the language was picked up by Microsoft and expanded significantly beyond its original
intent into their "Visual Basic" language/platform that was sold throughout the 1990s as a "rapid
application development" (RAD) tool for Windows programming.[5] It competed directly against
other RAD tools of the 1990s such as PowerBuilder.[6] Even though Visual Basic was a
successful development platform, it was discontinued after its 6th version (VB6) when Microsoft
introduced the .NET Framework and its related Visual Studio development platform in the early
2000s.
Language comparison
Though C# and VB.NET are syntactically very different, that is where the differences mostly
end. Microsoft developed both of these languages to be part of the same .NET Framework
development platform. They are both developed, managed, and supported by the same language
development team at Microsoft.[7] They compile to the same intermediate language (IL), which
runs against the same .NET Framework runtime libraries.[8] Although there are some differences
in the programming constructs (discussed further below), their differences are primarily syntactic
and, assuming one avoids the Visual Basic "Compatibility" libraries provided by Microsoft to aid
conversion from VB6, almost every command in VB has an equivalent command in C# and vice
versa. Lastly, both languages reference the same Base Classes of the .NET Framework to extend
their functionality. As a result, with few exceptions, a program written in either language can be
run through a simple syntax converter to translate to the other. There are many open source and
commercially available products for this purpose.
Runtime multi-language support
One of the main goals of .NET has been its multi-language support. The intent of the design was
that all of the various Microsoft languages should have the same level of access to all OS
features, should be able to expose the same level of power and usability, and simplify calling
from a module in one language to that written in another language.
In implementation, all .NET programming languages share the same runtime engine, uniform
Abstract syntax tree, and Common Intermediate Language. Additionally all .NET languages
have access to platform features including garbage collection, cross language inheritance,
exception handling, and debugging. This allows the same output binary to be produced from
any .NET programming language.
Development environment
Visual Studio provides minor differences in the development environment for C# and VB.Net.
With each subsequent release of Visual Studio, the differences between development
environments for these languages have been reduced. For instance early versions of Visual
Studio had poor support for Intellisense in C# compared to Visual Basic .NET, and did not offer
background compilation for C#.[9] Currently, the main differences in the development
environments are additional features for Visual Basic .NET that originated in VB6, including:
Background compilation is a feature of the Visual Studio IDE whereby code is compiled as it is
written by the programmer with the purpose of identifying compilation errors without requiring
the solution to be built. This feature has been available for Visual Basic since .NET 1.1 and was
present in early versions of Visual Studio for Visual Basic .NET. However, background
compilation is a relatively new concept for Visual C# and is available with service pack 1 for
Visual Studio 2008 Standard Edition and above. A distinct disadvantage for C# is that the Error
List panel does not update until the solution is rebuilt. Refactoring large projects in C# is made
more difficult by the need to frequently rebuild the solution in order to highlight compilation
errors.[10] Such is not the case with Visual Basic because the Error List panel is synchronised with
the background compiler.
Background Compilation is less demanding on system resources and results in faster build
cycles.[10] This is a particular advantage with large projects and can significantly reduce the time
required to start debugging in the IDE.[10]
Language features
The bulk of the differences between C# and VB.NET from a technical perspective are syntactic
sugar. That is, most of the features are in both languages, but some things are easier to do in one
language than another. Many of the differences between the two languages are actually centered
around the IDE.
Variables can be declared using the WithEvents construct. This construct is available so
that a programmer may select an object from the Class Name drop down list and then
select a method from the Declarations drop down list to have the Method signature
automatically inserted
Auto-wireup of events, VB.NET has the Handles syntax for events
Marshalling an object for multiple actions using an unqualified dot reference. This is
done using the With ... End With structure
IsNumeric evaluates whether a string can be cast into a numeric value (the equivalent for
C# requires using int.TryParse)
XML Literals[11]
Inline date declarations by using #1/1/2000# syntax (M/dd/yyyy).
Module (although C#'s sealed static classes with additional semantics, but each field has
to individually be declared as static)
Members of Modules imported to the current file, can be access with no preceding
container accessor (See Now for example)
The My namespace
COM components and interoperability was more powerful in VB.NET as the Object type
is bound at runtime,[12] however C#4.0 added the dynamic type which functions as a late
bound form of Object.
Namespaces can be imported in project level, so they don't have to be imported to each
individual file, like C#
In-line exceptions filtering by a Boolean expression, using "When expression" blocks.[13]
It can be achieved in C# using a catch block followed by if block.
With instruction Executes a series of instructions repeatedly refer to a single object or
structure.
Allows blocks of unsafe code (like C++/CLI) via the unsafe keyword
Partial Interfaces
Multi-line comments (note that the Visual Studio IDE supports multi-line commenting
for Visual Basic .NET)
Static classes (Classes which cannot contain any non-static members, although VB's
Modules are essentially sealed static classes with additional semantics)
Can use checked and unchecked contexts for fine-grained control of overflow/underflow
checking
Other characteristics of Visual Basic .NET not applicable to C#
It should be noted that although the default is for 'Option Strict' is off, it is recommended by
Microsoft[14] and widely considered to be a good to turn 'Option Strict' "on", due to the fact it
increases application performance, and eliminates the chance of naming errors and other
programming mistakes.[15]
Val() function which also parses a null value while converting into double (In c#
Convert.ToDouble() is used to convert any object into double type value, but which
throws exception in case of a null value)
CInt, CStr, CByte, CDbl, CBool, CByte, CDate, CLng, CCur, CObj and a wide variety of
converting functions built in the language
By default, numeric operations are not checked. This results in slightly faster code, at the
risk that numeric overflows will not be detected. However, the programmer can place
arithmetic operations into a checked context to activate overflow checking. (It can be
done in Visual Basic by checking an option)
Addition and string concatenation use the same token, +. Visual Basic .NET, however,
has separate tokens, + for addition and & for concatenation, although + can be used for
concatenation as well.
In Visual Basic .NET property methods may take parameters
C# is case-sensitive.
Syntax comparisons
Visual Basic .NET terminates a block of code with End BlockName statements (or Next
statements, for a for loop) which are more familiar for programmers with experience using T-
SQL. In C#, the braces, {}, are use to delimit blocks, which is more familiar to programmers
with experience in other widely-deployed languages such as C++ and Java. Additionally, in C# if
a block consists of only a single statement, the braces may be omitted.
C# is case sensitive while Visual Basic .NET is not. Thus in C# it is possible to have two
variables with the same name, for example variable1 and Variable1. Visual Studio will
correct the case of variables as they are typed in VB.NET. In many cases however, case
sensitivity can be useful. C# programmers typically capitalize type names and leave member and
variable names lowercase. This allows, for example, fairly natural naming of method arguments:
public int CalculateOrders(Customer customer). Of course, this can cause problems for
those converting C# code to a case-insensitive language, such as Visual Basic, or to those
unaccustomed to reading a case sensitive language.
Keywords
Visual Basic is not case sensitive, which means any combinations of upper and lower cases in
keywords are acceptable. However Visual Studio automatically converts all Visual Basic
keywords to the default capitalised forms, e.g. "Public", "If".
Visual Basic and C# share most keywords, with the difference being the default (Remember
Visual Basic is not case sensitive) Visual Basic keywords are the capitalised versions of the C#
keywords, e.g. "Public" vs "public", "If" vs "if".
A few keywords have very different versions in Visual Basic and C#:
Some C# keywords such as sealed represent different things when applied to methods as
opposed to when they are applied to class definitions. VB.NET, on the other hand, uses different
keywords for different contexts.
Comments
Conditionals
Loops
C# Visual Basic .NET
for (int i = 0; i <= number - 1; i++)
For i as integer = 0 To number - 1
{
' loop from zero up to one less
// loop from zero up to one less
than number
than number
Next
}
for (int i = number; i >= 0; i--)
For i as integer = number To 0 Step -1
{
' loops from number down to zero
// loops from number down to zero
Next
}
Exit For 'breaks out of a for loop
break; //breaks out of a loop Exit While 'breaks out of a while loop
Exit Do 'breaks out of a do loop
Comparers
Primitive types
Or: Or:
if (!(a == b)) //can also be written as
If Not a = b Then
(a != b)
' not equal
{
End If
// not equal
}
if (a == b & c == d | e == f)
If a = b And c = d Or e = f Then
{
' multiple comparisons
// multiple comparisons
End If
}
if (a == b && c == d || e == f) If a = b AndAlso c = d OrElse (e =
{ f) Then
// short-circuiting comparisons ' short-circuiting comparisons
} End If
Object types
C# Visual Basic .NET
if (Object.ReferenceEquals(a, b))
If a Is b Then 'Can also be written as If
{
Object.ReferenceEquals(a, b) Then
// variables refer to the same
' variables refer to the same instance
instance
End If
}
if (!Object.ReferenceEquals(a, b))
If a IsNot b Then
{
' variables do not refer to the same
// variables do not refer to
instance
the same instance
End If
}
if (a.Equals(b))
If a = b Then 'Or a.Equals(b)
{
' instances are equivalent
// instances are equivalent
End If
}
if (! a.Equals(b))
If a <> b Then
{
' not equivalent
// not equivalent
End If
}
var type = typeof(int); Dim type = GetType(Integer)
if (a is b)
{ If TypeOf a Is b Then
// types of a and b are ' types of a and b are compatible
compatible End If
}
if (!(a is b))
{ If Not TypeOf a Is b Then
// types of a and b are not ' types of a and b are not compatible
compatible End If
}
Note: these examples for equivalence tests assume neither the variable "a" nor the variable "b" is
a Null reference (Nothing in Visual Basic.NET). If "a" were null, the C# evaluation of the .equals
method would throw a NullReferenceException, whereas the VB.NET = operator would return
true if both were null, or false if only one was null (and evaluate the equals method if neither
were null). They also assume that the .equals method and the = operator are implemented for the
class type in question. Omitted for clarity, the exact transliteration would be:
C#
if(object.equals(a,b))
VB.NET
If a = b Then
============================Wiki Ends=====================================
Console.WriteLine("Hello, " & name & "!") Console.WriteLine("Hello, " + name + "!");
}
End Sub }
End Class }
End Namespace
VB.NET Comments C#
// Single line
/* Multiple
' Single line only line */
REM Single line only /// <summary>XML comments on single
''' <summary>XML comments</summary> line</summary>
/** <summary>XML comments on multiple
lines</summary> */
Initializing Initializing
Dim correct As Boolean = True bool correct = true;
Dim b As Byte = &H2A 'hex or &O52 for octal byte b = 0x2A; // hex
Dim person As Object = Nothing object person = null;
Dim name As String = "Dwight" string name = "Dwight";
Dim grade As Char = "B"c char grade = 'B';
Dim today As Date = #12/31/2010 12:15:00 DateTime today = DateTime.Parse("12/31/2010
PM# 12:15:00 PM");
Dim amount As Decimal = 35.99@ decimal amount = 35.99m;
Dim gpa As Single = 2.9! float gpa = 2.9f;
Dim pi As Double = 3.14159265 double pi = 3.14159265;
Dim lTotal As Long = 123456L long lTotal = 123456L;
Dim sTotal As Short = 123S short sTotal = 123;
Dim usTotal As UShort = 123US ushort usTotal = 123;
Dim uiTotal As UInteger = 123UI uint uiTotal = 123;
Dim ulTotal As ULong = 123UL ulong ulTotal = 123;
VB.NET Constants C#
' Can set to a const or var; may be initialized in // Can set to a const or var; may be initialized in a
a constructor constructor
ReadOnly MIN_DIAMETER As Single = 4.93 readonly float MIN_DIAMETER = 4.93f;
VB.NET Enumerations C#
Enum Action enum Action {Start, Stop, Rewind, Forward};
Start enum Status {Flunk = 50, Pass = 70, Excel = 90};
[Stop] ' Stop is a reserved word
Rewind Action a = Action.Stop;
Forward if (a != Action.Start)
End Enum Console.WriteLine(a + " is " + (int) a); // Prints
"Stop is 1"
Enum Status
Flunk = 50 Console.WriteLine((int) Status.Pass); // Prints 70
Pass = 70 Console.WriteLine(Status.Pass); // Prints Pass
Excel = 90
End Enum
VB.NET Operators C#
Comparison
Comparison
== < > <= >= !=
= < > <= >= <>
Arithmetic
Arithmetic
+ - * /
+ - * /
% (mod)
Mod
/ (integer division if both operands are ints)
\ (integer division)
Math.Pow(x, y)
^ (raise to a power)
Assignment
Assignment
= += -= *= /= %= &= |= ^= <<= >>= ++
= += -= *= /= \= ^= <<= >>= &=
--
Bitwise
Bitwise
And Or Xor Not << >>
& | ^ ~ << >>
Logical
Logical
AndAlso OrElse And Or Xor Not
&& || & | ^ !
String Concatenation
String Concatenation
&
+
VB.NET Choices C#
' Ternary/Conditional operator (IIf evaluates 2nd // Ternary/Conditional operator
and 3rd expressions) greeting = age < 20 ? "What's up?" : "Hello";
greeting = If(age < 20, "What's up?", "Hello")
if (age < 20)
' One line doesn't require "End If" greeting = "What's up?";
If age < 20 Then greeting = "What's up?" else
If age < 20 Then greeting = "What's up?" Else greeting = "Hello";
greeting = "Hello"
// Multiple statements must be enclosed in {}
' Use : to put two commands on same line if (x != 100 && y < 5) {
If x <> 100 AndAlso y < 5 Then x *= 5 : y *= x *= 5;
2 y *= 2;
}
' Preferred
If x <> 100 AndAlso y < 5 Then
x *= 5
y *= 2 No need for _ or : since ; is used to terminate each
End If statement.
VB.NET Loops C#
Post-test Loops:
Post-test Loop:
Do Do
do
c += 1 c += 1
c++;
Loop While c < 10 Loop Until c = 10
while (c < 10);
' Array or collection looping
Dim names As String() = {"Fred", "Sue",
"Barney"} // Array or collection looping
For Each s As String In names string[] names = {"Fred", "Sue", "Barney"};
Console.WriteLine(s) foreach (string s in names)
Next Console.WriteLine(s);
VB.NET Arrays C#
' 4 is the index of the last element, so it holds 5 // 5 is the size of the array
elements string[] names = new string[5];
Dim names(4) As String names[0] = "David";
names(0) = "David" names[5] = "Bobby"; // Throws
names(5) = "Bobby" ' Throws System.IndexOutOfRangeException
System.IndexOutOfRangeException
' Resize the array, keeping the existing values // C# can't dynamically resize an array. Just copy into
(Preserve is optional) new array.
ReDim Preserve names(6) string[] names2 = new string[7];
Array.Copy(names, names2, names.Length); // or
names.CopyTo(names2, 0);
VB.NET Functions C#
' Pass by value (in, default), reference (in/out), // Pass by value (in, default), reference (in/out),
and reference (out) and reference (out)
Sub TestFunc(ByVal x As Integer, ByRef y As void TestFunc(int x, ref int y, out int z) {
Integer, ByRef z As Integer) x++;
x += 1 y++;
y += 1 z = 5;
z=5 }
End Sub
int a = 1, b = 1, c; // c doesn't need initializing
Dim a = 1, b = 1, c As Integer ' c set to zero TestFunc(a, ref b, out c);
by default Console.WriteLine("{0} {1} {2}", a, b, c); // 1 2 5
TestFunc(a, b, c)
Console.WriteLine("{0} {1} {2}", a, b, c) ' 1 2 // Accept variable number of arguments
5 int Sum(params int[] nums) {
int sum = 0;
' Accept variable number of arguments foreach (int i in nums)
Function Sum(ByVal ParamArray nums As sum += i;
Integer()) As Integer return sum;
Sum = 0 }
For Each i As Integer In nums
Sum += i int total = Sum(4, 3, 2, 1); // returns 10
Next
End Function ' Or use Return statement like /* C# 4.0 supports optional parameters. Previous
C# versions required function overloading. */
void SayHello(string name, string prefix = "") {
Dim total As Integer = Sum(4, 3, 2, 1) ' returns Console.WriteLine("Greetings, " + prefix + " " +
10 name);
}
' Optional parameters must be listed last and
must have a default value SayHello("Strangelove", "Dr.");
Sub SayHello(ByVal name As String, Optional SayHello("Mom");
ByVal prefix As String = "")
Console.WriteLine("Greetings, " & prefix & " " &
name)
End Sub
SayHello("Strangelove", "Dr.")
SayHello("Mom")
VB.NET Strings C#
' Find and remember all matching patterns // Find and remember all matching patterns
Dim s As String = "My number is 305-1881, not string s = "My number is 305-1881, not 305-1818.";
305-1818." Regex r = new Regex("(\\d+-\\d+)");
Dim r As New Regex("(\d+-\d+)") // Matches 305-1881 and 305-1818
Dim m As Match = r.Match(s) ' Matches 305- for (Match m = r.Match(s); m.Success; m =
1881 and 305-1818 m.NextMatch())
While m.Success Console.WriteLine("Found number: " + m.Groups[1]
Console.WriteLine("Found number: " & + " at position " +
m.Groups(1).Value & " at position " _ m.Groups[1].Index);
& m.Groups(1).Index.ToString)
m = m.NextMatch()
End While
// Remeber multiple parts of matched pattern
' Remeber multiple parts of matched pattern Regex r = new Regex("@(\d\d):(\d\d) (am|pm)");
Dim r As New Regex("(\d\d):(\d\d) (am|pm)") Match m = r.Match("We left at 03:15 pm.");
Dim m As Match = r.Match("We left at 03:15 if (m.Success) {
pm.") Console.WriteLine("Hour: " + m.Groups[1]); //
If m.Success Then 03
Console.WriteLine("Hour: " & Console.WriteLine("Min: " + m.Groups[2]); //
m.Groups(1).ToString) ' 03 15
Console.WriteLine("Min: " & Console.WriteLine("Ending: " + m.Groups[3]); //
m.Groups(2).ToString) ' 15 pm
Console.WriteLine("Ending: " & }
m.Groups(3).ToString) ' pm
End If // Replace all occurrances of a pattern
Regex r = new Regex("h\\w+?d",
' Replace all occurrances of a pattern RegexOptions.IgnoreCase);
Dim r As New Regex("h\w+?d", string s = r.Replace("I heard this was HARD!",
RegexOptions.IgnoreCase) "easy")); // I easy this was easy!
Dim s As String = r.Replace("I heard this was
HARD!", "easy") ' I easy this was easy! // Replace matched patterns
string s = Regex.Replace("123 < 456", @"(\d+) .
' Replace matched patterns (\d+)", "$2 > $1"); // 456 > 123
Dim s As String = Regex.Replace("123 < 456",
"(\d+) . (\d+)", "$2 > $1") ' 456 > 123 // Split a string based on a pattern
string names = "Michael, Dwight, Jim, Pam";
' Split a string based on a pattern Regex r = new Regex(@",\s*");
Dim names As String = "Michael, Dwight, Jim, string[] parts = r.Split(names); // One name in each
Pam" slot
Dim r As New Regex(",\s*")
Dim parts() As String = r.Split(names) ' One
name in each slot
VB.NET Namespaces C#
' or // or
Dim hero2 As SuperHero = hero ' Both SuperHero hero2 = hero; // Both reference the same
reference the same object object
hero2.Name = "WormWoman" hero2.Name = "WormWoman";
Console.WriteLine(hero.Name) ' Prints Console.WriteLine(hero.Name); // Prints
WormWoman WormWoman
hero = Nothing ' Free the object hero = null ; // Free the object
' Mark object for quick disposal // Mark object for quick disposal
Using reader As StreamReader = using (StreamReader reader =
File.OpenText("test.txt")) {
File.OpenText("test.txt") string line;
Dim line As String = reader.ReadLine() while ((line = reader.ReadLine()) != null)
While Not line Is Nothing Console.WriteLine(line);
Console.WriteLine(line) }
line = reader.ReadLine()
End While
End Using
VB.NET Structs C#
Public Sub New(ByVal name As String, ByVal public StudentRecord(string name, float gpa) {
gpa As Single) this.name = name;
Me.name = name this.gpa = gpa;
Me.gpa = gpa }
End Sub }
End Structure
StudentRecord stu = new StudentRecord("Bob", 3.5f);
Dim stu As StudentRecord = New StudentRecord stu2 = stu;
StudentRecord("Bob", 3.5)
Dim stu2 As StudentRecord = stu stu2.name = "Sue";
Console.WriteLine(stu.name); // Prints Bob
stu2.name = "Sue" Console.WriteLine(stu2.name); // Prints Sue
Console.WriteLine(stu.name) ' Prints Bob
Console.WriteLine(stu2.name) ' Prints Sue
VB.NET Properties C#
VB.NET Generics C#
' Enforce accepted data type at compile-time // Enforce accepted data type at compile-time
Dim numbers As New List(Of Integer) List<int> numbers = new List<int>();
numbers.Add(2) numbers.Add(2);
numbers.Add(4) numbers.Add(4);
DisplayList(Of Integer)(numbers) DisplayList<int>(numbers);
' Subroutine can display any type of List // Function can display any type of List
Sub DisplayList(Of T)(ByVal list As List(Of T)) void DisplayList<T>(List<T> list) {
For Each item As T In list foreach (T item in list)
Console.WriteLine(item) Console.WriteLine(item);
Next }
End Sub
// Class works on any data type
' Class works on any data type class SillyList<T> {
Class SillyList(Of T) private T[] list = new T[10];
Private list(10) As T private Random rand = new Random();
Private rand As New Random
public void Add(T item) {
Public Sub Add(ByVal item As T) list[rand.Next(10)] = item;
list(rand.Next(10)) = item }
End Sub
public T GetItem() {
Public Function GetItem() As T return list[rand.Next(10)];
Return list(rand.Next(10)) }
End Function }
End Class
// Limit T to only types that implement IComparable
' Limit T to only types that implement T Maximum<T>(params T[] items) where T :
IComparable IComparable<T> {
Function Maximum(Of T As IComparable) T max = items[0];
(ByVal ParamArray items As T()) As T foreach (T item in items)
Dim max As T = items(0) if (item.CompareTo(max) > 0)
For Each item As T In items max = item;
If item.CompareTo(max) > 0 Then max = return max;
item }
Next
Return max
End Function
VB.NET LINQ C#
' Get all numbers in the array above 4 // Get all numbers in the array above 4
Dim results = From value In nums var results = from value in nums
Where value > 4 where value > 4
Select value select value;
Console.WriteLine(goodStudents.First.Name)
' Sue
' Read all lines from text file // Read all lines from text file
Dim reader As StreamReader = StreamReader reader =
File.OpenText("c:\myfile.txt") File.OpenText("c:\\myfile.txt");
Dim line As String = reader.ReadLine() string line = reader.ReadLine();
While Not line Is Nothing while (line != null) {
Console.WriteLine(line) Console.WriteLine(line);
line = reader.ReadLine() line = reader.ReadLine();
End While }
reader.Close() reader.Close();