Comparison of C Sharp and Visual Basic

32
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

Transcript of Comparison of C Sharp and Visual Basic

Page 1: 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.

Page 2: Comparison of C Sharp and Visual Basic

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:

The default namespace is hidden (but can be disabled) Certain project files are hidden (the user can show them) The auto-generated My.* namespaces contain many commonly-used shortcuts brought

over from VB6, such as methods for operating on the registry and application configuration file

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]

Page 3: Comparison of C Sharp and Visual Basic

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.

Features of Visual Basic .NET not found in C#

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.

Features of C# not found in Visual Basic .NET

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

Page 4: Comparison of C Sharp and Visual Basic

Other characteristics of Visual Basic .NET not applicable to C#

Conversion of Boolean value True to Integer may yield -1 or 1 depending on the conversion used

Assigning and comparing variables uses the same token, =. Whereas C# has separate tokens, == for comparison and = to assign a value

VB.NET is not case-sensitive. Type checking is less strict by default. If the default is left in place, It will auto convert

type without notifying programmer, for example:

Dim i As Integer = "1" 'Compiler automatically converts String to IntegerDim j As String = 1 'Compiler automatically converts Integer to StringIf i = j Then 'Compiler does cast and compare between i and j

MessageBox.Show("Avoid using, but this message will appear!")End If

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

Other characteristics of C# not applicable to Visual Basic .NET

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.

Page 5: Comparison of C Sharp and Visual Basic

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".

C# is case sensitive and all C# keywords are in lower cases.

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#:

Friend vs internal - access modifiers allowing inter-class but intra-assembly reference Me vs this - a self-reference to the current object instance MustInherit vs abstract - prevents a class from being directly instantiated, and forces

consumers to create object references to only derived classes MustOverride vs abstract - for forcing derived classes to override this method MyBase vs base - for referring to the base class from which the current class is derived NotInheritable vs sealed - for declaring classes that may not be inherited NotOverridable vs sealed - for declaring methods that may not be overridden by

derived classes Overridable vs virtual - declares a method as being able to be overridden in derived

classes Shared vs static - for declaring methods that do not require an explicit instance of an

object

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.

Page 6: Comparison of C Sharp and Visual Basic

Comments

C# Visual Basic .NET//Single line comment /*Multi-line comment line 2 line 3*/ ///XML single line comment /**XML multi-line comment line 2 line 3*/

'Single line comment

Multi-line comment not available

'''XML single line comment

XML multi-line comment not available

Conditionals

C# Visual Basic .NETif (condition){ // condition is true }

If condition Then ' condition is trueEnd If

if (condition){ // condition is true }else{ // condition is false }

If condition Then ' condition is trueElse ' condition is falseEnd If

if (condition){ // condition is true }else if (othercondition){ // condition is false and othercondition is true}

If condition Then ' condition is trueElseIf othercondition Then ' condition is false and othercondition is trueEnd If

if (condition){ // condition is true }else if (othercondition){ // condition is false and othercondition is true}else{ // condition and othercondition are false }

If condition Then ' condition is trueElseIf othercondition Then ' condition is false and othercondition is trueElse ' condition and othercondition falseEnd If

Loops

Page 7: Comparison of C Sharp and Visual Basic

C# Visual Basic .NETfor (int i = 0; i <= number - 1; i++) { // loop from zero up to one less than number}

For i as integer = 0 To number - 1 ' loop from zero up to one less than numberNext

for (int i = number; i >= 0; i--){ // loops from number down to zero}

For i as integer = number To 0 Step -1 ' loops from number down to zeroNext

break; //breaks out of a loopExit For 'breaks out of a for loopExit While 'breaks out of a while loopExit Do 'breaks out of a do loop

Comparers

Primitive types

C# Visual Basic .NET

if (a == b) { // equal}

If a = b Then ' equalEnd If

if (a != b){ // not equal}

Or:

if (!(a == b)) //can also be written as (a != b){ // not equal}

If a <> b Then ' not equalEnd If

Or:

If Not a = b Then ' not equalEnd If

if (a == b & c == d | e == f){ // multiple comparisons}

If a = b And c = d Or e = f Then ' multiple comparisonsEnd If

if (a == b && c == d || e == f){ // short-circuiting comparisons}

If a = b AndAlso c = d OrElse (e = f) Then ' short-circuiting comparisonsEnd If

Object types

Page 8: Comparison of C Sharp and Visual Basic

C# Visual Basic .NETif (Object.ReferenceEquals(a, b)) { // variables refer to the same instance}

If a Is b Then 'Can also be written as If Object.ReferenceEquals(a, b) Then ' variables refer to the same instanceEnd If

if (!Object.ReferenceEquals(a, b)) { // variables do not refer to the same instance}

If a IsNot b Then ' variables do not refer to the same instanceEnd If

if (a.Equals(b)) { // instances are equivalent}

If a = b Then 'Or a.Equals(b) ' instances are equivalentEnd If

if (! a.Equals(b)){ // not equivalent}

If a <> b Then ' not equivalentEnd If

var type = typeof(int); Dim type = GetType(Integer)if (a is b){ // types of a and b are compatible}

If TypeOf a Is b Then ' types of a and b are compatibleEnd If

if (!(a is b)){ // types of a and b are not compatible}

If Not TypeOf a Is b Then ' types of a and b are not compatibleEnd 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=====================================

VB.NET and C# Comparison

This is a quick reference guide to highlight some key syntactical differences between VB.NET

Page 9: Comparison of C Sharp and Visual Basic

and C#. Hope you find this useful!Thank you to Tom Shelton, Fergus Cooney, Steven Swafford, Gjuro Kladaric, and others for

your

VB.NET Program Structure C#

Imports System

Namespace Hello   Class HelloWorld       Overloads Shared Sub Main(ByVal args() As String)          Dim name As String = "VB.NET"

         'See if an argument was passed from the command line          If args.Length = 1 Then name = args(0)

          Console.WriteLine("Hello, " & name & "!")       End Sub    End Class End Namespace

using System;

namespace Hello {   public class HelloWorld {      public static void Main(string[] args) {         string name = "C#";

         // See if an argument was passed from the command line         if (args.Length == 1)            name = args[0];

         Console.WriteLine("Hello, " + name + "!");      }   }}

VB.NET Comments C#

' Single line onlyREM Single line only''' <summary>XML comments</summary>

// Single line/* Multiple    line  *//// <summary>XML comments on single line</summary>/** <summary>XML comments on multiple lines</summary> */

VB.NET Data Types C#

Value TypesBooleanByte, SByteCharShort, UShort, Integer, UInteger, Long, ULongSingle, DoubleDecimalDate   (alias of System.DateTime)

Reference TypesObjectString

Value Typesboolbyte, sbytecharshort, ushort, int, uint, long, ulongfloat, doubledecimalDateTime   (not a built-in C# type)

Reference Typesobjectstring

Initializing

Page 10: Comparison of C Sharp and Visual Basic

InitializingDim correct As Boolean = TrueDim b As Byte = &H2A   'hex or &O52 for octalDim person As Object = NothingDim name As String = "Dwight"Dim grade As Char = "B"cDim today As Date = #12/31/2010 12:15:00 PM#Dim amount As Decimal = 35.99@Dim gpa As Single = 2.9!Dim pi As Double = 3.14159265Dim lTotal As Long = 123456LDim sTotal As Short = 123SDim usTotal As UShort = 123USDim uiTotal As UInteger = 123UIDim ulTotal As ULong = 123UL

Implicitly Typed Local VariablesDim s = "Hello!"Dim nums = New Integer() {1, 2, 3}Dim hero = New SuperHero With {.Name = "Batman"}

Type InformationDim x As Integer Console.WriteLine(x.GetType())          ' Prints System.Int32 Console.WriteLine(GetType(Integer))   ' Prints System.Int32 Console.WriteLine(TypeName(x))        ' Prints Integer

Dim c as New CircleIf TypeOf c Is Shape Then _    Console.WriteLine("c is a Shape")

Type Conversion / CastingDim d As Single = 3.5 Dim i As Integer = CType(d, Integer)   ' set to 4 (Banker's rounding)i = CInt(d)  ' same result as CTypei = Int(d)    ' set to 3 (Int function truncates the decimal)

Dim o As Object = 2i = DirectCast(o, Integer)   ' Throws InvalidCastException if type cast fails

Dim s As New ShapeDim c As Circle = TryCast(s, Circle)   ' Returns Nothing if type cast fails

bool correct = true;byte b = 0x2A;   // hexobject person = null;string name = "Dwight";char grade = 'B';DateTime today = DateTime.Parse("12/31/2010 12:15:00 PM");decimal amount = 35.99m;float gpa = 2.9f;double pi = 3.14159265;long lTotal = 123456L;short sTotal = 123;ushort usTotal = 123;uint uiTotal = 123;ulong ulTotal = 123;

Implicitly Typed Local Variablesvar s = "Hello!";var nums = new int[] { 1, 2, 3 };var hero = new SuperHero() { Name = "Batman" };

Type Informationint x;Console.WriteLine(x.GetType());              // Prints System.Int32Console.WriteLine(typeof(int));               // Prints System.Int32 Console.WriteLine(x.GetType().Name);   // prints Int32

Circle c = new Circle();if (c is Shape)    Console.WriteLine("c is a Shape");

Type Conversion / Casting float d = 3.5f; i = Convert.ToInt32(d);     // Set to 4 (rounds) int i = (int)d;     // set to 3 (truncates decimal)

object o = 2;int i = (int)o;   // Throws InvalidCastException if type cast fails

Shape s = new Shape();Circle c = s as Circle;   // Returns null if type cast fails

VB.NET Constants C#

Page 11: Comparison of C Sharp and Visual Basic

Const MAX_STUDENTS As Integer = 25

' Can set to a const or var; may be initialized in a constructorReadOnly MIN_DIAMETER As Single = 4.93

const int MAX_STUDENTS = 25;

// Can set to a const or var; may be initialized in a constructor readonly float MIN_DIAMETER = 4.93f;

VB.NET Enumerat ions C#

Enum Action   Start   [Stop]   ' Stop is a reserved word  Rewind   Forward End Enum

Enum Status   Flunk = 50   Pass = 70   Excel = 90 End Enum

Dim a As Action = Action.Stop If a <> Action.Start Then _    Console.WriteLine(a.ToString & " is " & a)     ' Prints "Stop is 1"

Console.WriteLine(Status.Pass)     ' Prints 70 Console.WriteLine(Status.Pass.ToString())     ' Prints Pass

enum Action {Start, Stop, Rewind, Forward};enum Status {Flunk = 50, Pass = 70, Excel = 90};

Action a = Action.Stop;if (a != Action.Start)  Console.WriteLine(a + " is " + (int) a);    // Prints "Stop is 1"

Console.WriteLine((int) Status.Pass);    // Prints 70 Console.WriteLine(Status.Pass);      // Prints Pass

VB.NET Operators C#

Comparison=  <  >  <=  >=  <>

Arithmetic+  -  *  /Mod\  (integer division)^  (raise to a power)

Assignment=  +=  -=  *=  /=  \=  ^=  <<=  >>=  &=

BitwiseAnd   Or   Xor   Not   <<   >>

LogicalAndAlso   OrElse   And   Or   Xor   Not

Comparison==  <  >  <=  >=  !=

Arithmetic+  -  *  /%  (mod)/  (integer division if both operands are ints)Math.Pow(x, y)

Assignment=  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --

Bitwise&   |   ^   ~   <<   >>

Logical

Page 12: Comparison of C Sharp and Visual Basic

Note: AndAlso and OrElse perform short-circuit logical evaluations

String Concatenation&

&&   ||   &   |   ^   !

Note: && and || perform short-circuit logical evaluations

String Concatenation+

VB.NET Choices C#

' Ternary/Conditional operator (IIf evaluates 2nd and 3rd expressions)greeting = If(age < 20, "What's up?", "Hello")

' One line doesn't require "End If"If age < 20 Then greeting = "What's up?" If age < 20 Then greeting = "What's up?" Else greeting = "Hello"

' Use : to put two commands on same lineIf x <> 100 AndAlso y < 5 Then x *= 5 : y *= 2  

' PreferredIf x <> 100 AndAlso y < 5 Then  x *= 5   y *= 2End If

' Use _ to break up long single line or use implicit line breakIf whenYouHaveAReally < longLine And   itNeedsToBeBrokenInto2 > Lines Then _  UseTheUnderscore(charToBreakItUp)

'If x > 5 Then   x *= y ElseIf x = 5 OrElse y Mod 2 = 0 Then   x += y ElseIf x < 10 Then   x -= y Else   x /= y End If

Select Case color   ' Must be a primitive data type  Case "pink", "red"    r += 1   Case "blue"     b += 1   Case "green"

// Ternary/Conditional operatorgreeting = age < 20 ? "What's up?" : "Hello";

if (age < 20)  greeting = "What's up?";else  greeting = "Hello";

// Multiple statements must be enclosed in {}if (x != 100 && y < 5) {     x *= 5;  y *= 2;}

No need for _ or : since ; is used to terminate each statement.

if (x > 5)   x *= y; else if (x == 5 || y % 2 == 0)   x += y; else if (x < 10)   x -= y; else   x /= y;

// Every case must end with break or goto case switch (color) {                          // Must be integer or string  case "pink":  case "red":    r++;    break;   case "blue":   b++;   break;  case "green": g++;   break;  default:    other++;   break;       // break necessary on default

Page 13: Comparison of C Sharp and Visual Basic

    g += 1   Case Else     other += 1 End Select

}

VB.NET Loops C#

Pre-test Loops:

While c < 10   c += 1 End While

Do Until c = 10   c += 1 Loop

Do While c < 10   c += 1 Loop

For c = 2 To 10 Step 2   Console.WriteLine(c) Next

Post-test Loops:

Do   c += 1 Loop While c < 10

Do   c += 1 Loop Until c = 10

'  Array or collection loopingDim names As String() = {"Fred", "Sue", "Barney"} For Each s As String In names   Console.WriteLine(s) Next

' Breaking out of loopsDim i As Integer = 0While (True)  If (i = 5) Then Exit While  i += 1End While

' Continue to next iterationFor i = 0 To 4  If i < 4 Then Continue For  Console.WriteLine(i)   ' Only prints 4Next

Pre-test Loops:  

// no "until" keywordwhile (c < 10)   c++;

for (c = 2; c <= 10; c += 2)   Console.WriteLine(c);

Post-test Loop:

do   c++; while (c < 10);

// Array or collection loopingstring[] names = {"Fred", "Sue", "Barney"};foreach (string s in names)  Console.WriteLine(s);

// Breaking out of loopsint i = 0;while (true) {  if (i == 5)    break;  i++;}

// Continue to next iterationfor (i = 0; i <= 4; i++) {  if (i < 4)    continue;  Console.WriteLine(i);   // Only prints 4}

VB.NET Arrays C#

Dim nums() As Integer = {1, 2, 3} For i As Integer = 0 To nums.Length - 1   Console.WriteLine(nums(i))

int[] nums = {1, 2, 3};for (int i = 0; i < nums.Length; i++)  Console.WriteLine(nums[i]);

Page 14: Comparison of C Sharp and Visual Basic

Next

' 4 is the index of the last element, so it holds 5 elementsDim names(4) As String names(0) = "David"names(5) = "Bobby"  ' Throws System.IndexOutOfRangeException

' Resize the array, keeping the existing values (Preserve is optional)ReDim Preserve names(6)

Dim twoD(rows-1, cols-1) As Single twoD(2, 0) = 4.5

Dim jagged()() As Integer = { _   New Integer(4) {}, New Integer(1) {}, New Integer(2) {} } jagged(0)(4) = 5

// 5 is the size of the arraystring[] names = new string[5];names[0] = "David";names[5] = "Bobby";   // Throws System.IndexOutOfRangeException

// C# can't dynamically resize an array.  Just copy into new array.string[] names2 = new string[7]; Array.Copy(names, names2, names.Length);   // or names.CopyTo(names2, 0); 

float[,] twoD = new float[rows, cols];twoD[2,0] = 4.5f; 

int[][] jagged = new int[3][] {   new int[5], new int[2], new int[3] };jagged[0][4] = 5;

VB.NET Funct ions C#

' Pass by value (in, default), reference (in/out), and reference (out)  Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)  x += 1  y += 1   z = 5 End Sub

Dim a = 1, b = 1, c As Integer   ' c set to zero by default  TestFunc(a, b, c) Console.WriteLine("{0} {1} {2}", a, b, c)   ' 1 2 5

' Accept variable number of arguments Function Sum(ByVal ParamArray nums As Integer()) As Integer   Sum = 0    For Each i As Integer In nums     Sum += i   Next End Function   ' Or use Return statement like C#

Dim total As Integer = Sum(4, 3, 2, 1)   '

// Pass by value (in, default), reference (in/out), and reference (out)void TestFunc(int x, ref int y, out int z) {  x++;    y++;  z = 5;}

int a = 1, b = 1, c;  // c doesn't need initializingTestFunc(a, ref b, out c);Console.WriteLine("{0} {1} {2}", a, b, c);  // 1 2 5

// Accept variable number of argumentsint Sum(params int[] nums) {  int sum = 0;  foreach (int i in nums)    sum += i;  return sum;}

int total = Sum(4, 3, 2, 1);   // returns 10

/* C# 4.0 supports optional parameters. Previous versions required function overloading. */  void SayHello(string name, string prefix = "") {

Page 15: Comparison of C Sharp and Visual Basic

returns 10

' Optional parameters must be listed last and must have a default value Sub SayHello(ByVal name As String, Optional ByVal prefix As String = "")  Console.WriteLine("Greetings, " & prefix & " " & name) End Sub

SayHello("Strangelove", "Dr.")SayHello("Mom")

  Console.WriteLine("Greetings, " + prefix + " " + name);} 

SayHello("Strangelove", "Dr.");SayHello("Mom");

VB.NET Str ings C#

Special character constants (all also accessible from ControlChars class)vbCrLf, vbCr, vbLf, vbNewLine vbNullString vbTab vbBack vbFormFeed vbVerticalTab""

' String concatenation (use & or +) Dim school As String = "Harding" & vbTabschool = school & "University" ' school is "Harding (tab) University"

' CharsDim letter As Char = school.Chars(0)   ' letter is H letter = "Z"c                                         ' letter is Z letter = Convert.ToChar(65)                ' letter is A letter = Chr(65)                                 ' same thing Dim word() As Char = school.ToCharArray() ' word holds Harding

' No string literal operator Dim msg As String = "File is c:\temp\x.dat"

' String comparisonDim mascot As String = "Bisons"If (mascot = "Bisons") Then   ' trueIf (mascot.Equals("Bisons")) Then   ' trueIf (mascot.ToUpper().Equals("BISONS")) Th

Escape sequences\r    // carriage-return\n    // line-feed\t    // tab\\    // backslash\"    // quote

// String concatenationstring school = "Harding\t"; school = school + "University";   // school is "Harding (tab) University"

// Charschar letter = school[0];            // letter is H letter = 'Z';                               // letter is Z letter = Convert.ToChar(65);     // letter is A letter = (char)65;                    // same thing char[] word = school.ToCharArray();   // word holds Harding

// String literal string msg = @"File is c:\temp\x.dat"; // same as string msg = "File is c:\\temp\\x.dat";

// String comparisonstring mascot = "Bisons"; if (mascot == "Bisons")    // trueif (mascot.Equals("Bisons"))   // trueif (mascot.ToUpper().Equals("BISONS"))   // trueif (mascot.CompareTo("Bisons") == 0)    // true

// String matching - No Like equivalent, use Regex

Page 16: Comparison of C Sharp and Visual Basic

en  ' trueIf (mascot.CompareTo("Bisons") = 0) Then   ' true

' String matching with Like - Regex is more powerfulIf ("John 3:16" Like "Jo[Hh]? #:*") Then   'true

' Substrings = mascot.Substring(2, 3)) ' s is "son"

' Replacements = mascot.Replace("sons", "nomial")) ' s is "Binomial"

' SplitDim names As String = "Michael,Dwight,Jim,Pam"Dim parts() As String = names.Split(",".ToCharArray())   ' One name in each slot

' Date to stringDim dt As New DateTime(1973, 10, 12)Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy")   ' Oct 12, 1973

' Integer to StringDim x As Integer = 2Dim y As String = x.ToString()     ' y is "2"

' String to IntegerDim x As Integer = Convert.ToInt32("-5")   ' x is -5

' Mutable string Dim buffer As New System.Text.StringBuilder("two ")buffer.Append("three ")buffer.Insert(0, "one ")buffer.Replace("two", "TWO")Console.WriteLine(buffer)         ' Prints "one TWO three"

// Substrings = mascot.Substring(2, 3))     // s is "son"

// Replacements = mascot.Replace("sons", "nomial"))     // s is "Binomial"

// Splitstring names = "Michael,Dwight,Jim,Pam";string[] parts = names.Split(",".ToCharArray());   // One name in each slot

// Date to stringDateTime dt = new DateTime(1973, 10, 12);string s = dt.ToString("MMM dd, yyyy");     // Oct 12, 1973

// int to stringint x = 2;string y = x.ToString();     // y is "2"

// string to intint x = Convert.ToInt32("-5");     // x is -5

// Mutable string System.Text.StringBuilder buffer = new System.Text.StringBuilder("two "); buffer.Append("three "); buffer.Insert(0, "one "); buffer.Replace("two", "TWO"); Console.WriteLine(buffer);     // Prints "one TWO three"

VB.NET Regular Express ions C#

Imports System.Text.RegularExpressions using System.Text.RegularExpressions;

Page 17: Comparison of C Sharp and Visual Basic

' Match a string patternDim r As New Regex("j[aeiou]h?. \d:*", RegexOptions.IgnoreCase Or _        RegexOptions.Compiled)If (r.Match("John 3:16").Success) Then   'true    Console.WriteLine("Match")End If

' Find and remember all matching patternsDim s As String = "My number is 305-1881, not 305-1818."Dim r As New Regex("(\d+-\d+)")Dim m As Match = r.Match(s)     ' Matches 305-1881 and 305-1818While m.Success    Console.WriteLine("Found number: " & m.Groups(1).Value & " at position " _            & m.Groups(1).Index.ToString)    m = m.NextMatch() End While

' Remeber multiple parts of matched patternDim r As New Regex("(\d\d):(\d\d) (am|pm)")Dim m As Match = r.Match("We left at 03:15 pm.")If m.Success Then    Console.WriteLine("Hour: " & m.Groups(1).ToString)       ' 03    Console.WriteLine("Min: " & m.Groups(2).ToString)         ' 15    Console.WriteLine("Ending: " & m.Groups(3).ToString)   ' pmEnd If

' Replace all occurrances of a patternDim r As New Regex("h\w+?d", RegexOptions.IgnoreCase)Dim s As String = r.Replace("I heard this was HARD!", "easy")   ' I easy this was easy!

' Replace matched patternsDim s As String = Regex.Replace("123 < 456", "(\d+) . (\d+)", "$2 > $1")   ' 456 > 123

' Split a string based on a patternDim names As String = "Michael, Dwight, Jim, Pam"Dim r As New Regex(",\s*")Dim parts() As String = r.Split(names)   ' One name in each slot

// Match a string pattern Regex r = new Regex(@"j[aeiou]h?. \d:*", RegexOptions.IgnoreCase |         RegexOptions.Compiled);if (r.Match("John 3:16").Success)   // true    Console.WriteLine("Match");

// Find and remember all matching patternsstring s = "My number is 305-1881, not 305-1818.";Regex r = new Regex("(\\d+-\\d+)");// Matches 305-1881 and 305-1818for (Match m = r.Match(s); m.Success; m = m.NextMatch())     Console.WriteLine("Found number: " + m.Groups[1] + " at position " +         m.Groups[1].Index);

// Remeber multiple parts of matched patternRegex r = new Regex("@(\d\d):(\d\d) (am|pm)");Match m = r.Match("We left at 03:15 pm.");if (m.Success) {    Console.WriteLine("Hour: " + m.Groups[1]);     // 03     Console.WriteLine("Min: " + m.Groups[2]);       // 15     Console.WriteLine("Ending: " + m.Groups[3]); // pm }

// Replace all occurrances of a patternRegex r = new Regex("h\\w+?d", RegexOptions.IgnoreCase);string s = r.Replace("I heard this was HARD!", "easy"));   // I easy this was easy!

// Replace matched patternsstring s = Regex.Replace("123 < 456", @"(\d+) . (\d+)", "$2 > $1");   // 456 > 123

// Split a string based on a patternstring names = "Michael, Dwight, Jim, Pam";Regex r = new Regex(@",\s*");string[] parts = r.Split(names);   // One name in each slot

Page 18: Comparison of C Sharp and Visual Basic

VB.NET Except ion Handl ing C#

' Throw an exceptionDim ex As New Exception("Something is really wrong.") Throw  ex 

' Catch an exceptionTry   y = 0  x = 10 / yCatch ex As Exception When y = 0 ' Argument and When is optional  Console.WriteLine(ex.Message) Finally   Beep() End Try

' Deprecated unstructured error handlingOn Error GoTo MyErrorHandler...MyErrorHandler: Console.WriteLine(Err.Description)

// Throw an exceptionException up = new Exception("Something is really wrong."); throw up;  // ha ha

// Catch an exceptiontry {   y = 0;   x = 10 / y; } catch (Exception ex) {   // Argument is optional, no "When" keyword   Console.WriteLine(ex.Message); } finally {   Microsoft.VisualBasic.Interaction.Beep(); }

VB.NET Namespaces C#

Namespace Harding.Compsci.Graphics   ...End Namespace

' or

Namespace Harding   Namespace Compsci     Namespace Graphics       ...    End Namespace   End Namespace End Namespace

Imports Harding.Compsci.Graphics

namespace Harding.Compsci.Graphics {  ...}

// or

namespace Harding {  namespace Compsci {    namespace Graphics {      ...    }  }}

using Harding.Compsci.Graphics;

VB.NET Classes / In ter faces C#

Access Modifiers Public

Access Modifiers public

Page 19: Comparison of C Sharp and Visual Basic

PrivateFriendProtectedProtected Friend

Class ModifiersMustInheritNotInheritable

Method Modifiers MustOverrideNotInheritableSharedOverridable

' All members are SharedModule

' Partial classesPartial Class Competition  ...End Class 

' InheritanceClass FootballGame  Inherits Competition  ...End Class 

' Interface definitionInterface IAlarmClock  Sub Ring()  Property TriggerDateTime() As DateTimeEnd Interface

' Extending an interfaceInterface IAlarmClock   Inherits IClock  ...End Interface

' Interface implementationClass WristWatch   Implements IAlarmClock, ITimer

  Public Sub Ring() Implements IAlarmClock.Ring    Console.WriteLine("Wake up!")  End Sub

  Public Property TriggerDateTime As DateTime Implements IAlarmClock.TriggerDateTime  ...End Class 

privateinternalprotectedprotected internal

Class Modifiers abstractsealedstatic

Method Modifiers abstractsealedstaticvirtual

No Module equivalent - just use static class

// Partial classespartial class Competition {  ...}

// Inheritanceclass FootballGame : Competition {  ...}

// Interface definitioninterface IAlarmClock {  void Ring();   DateTime CurrentDateTime { get; set; }}

// Extending an interface interface IAlarmClock : IClock {  ...}

// Interface implementationclass WristWatch : IAlarmClock, ITimer {

  public void Ring() {    Console.WriteLine("Wake up!");  }

  public DateTime TriggerDateTime { get; set; }  ...}

Page 20: Comparison of C Sharp and Visual Basic

VB.NET Constructors / Dest ructors C#

Class SuperHero  Private powerLevel As Integer

  Public Sub New()     powerLevel = 0   End Sub

  Public Sub New(ByVal powerLevel As Integer)     Me.powerLevel = powerLevel   End Sub

  Shared Sub New()    ' Shared constructor invoked before 1st instance is created  End Sub

  Protected Overrides Sub Finalize()    ' Destructor to free unmanaged resources     MyBase.Finalize()   End SubEnd Class

class SuperHero {  private int powerLevel;

  public SuperHero() {     powerLevel = 0;  }

  public SuperHero(int powerLevel) {    this.powerLevel = powerLevel;   }

  static SuperHero() {    // Static constructor invoked before 1st instance is created  }

  ~SuperHero() {    // Destructor implicitly creates a Finalize method  }}

VB.NET Using Objects C#

Dim hero As SuperHero = New SuperHero' orDim hero As New SuperHero

With hero   .Name = "SpamMan"   .PowerLevel = 3 End With

hero.Defend("Laura Jones") hero.Rest()     ' Calling Shared method' orSuperHero.Rest()

Dim hero2 As SuperHero = hero  ' Both reference the same object hero2.Name = "WormWoman" Console.WriteLine(hero.Name)   ' Prints WormWoman

hero = Nothing    ' Free the object

If hero Is Nothing Then _   hero = New SuperHero

SuperHero hero = new SuperHero();

// No "With" constructhero.Name = "SpamMan"; hero.PowerLevel = 3;

hero.Defend("Laura Jones");SuperHero.Rest();   // Calling static method

SuperHero hero2 = hero;   // Both reference the same object hero2.Name = "WormWoman"; Console.WriteLine(hero.Name);   // Prints WormWoman

hero = null ;   // Free the object

if (hero == null)  hero = new SuperHero();

Page 21: Comparison of C Sharp and Visual Basic

Dim obj As Object = New SuperHero If TypeOf obj Is SuperHero Then _  Console.WriteLine("Is a SuperHero object.")

' Mark object for quick disposalUsing reader As StreamReader = File.OpenText("test.txt")  Dim line As String = reader.ReadLine()  While Not line Is Nothing    Console.WriteLine(line)    line = reader.ReadLine()  End WhileEnd Using

Object obj = new SuperHero(); if (obj is SuperHero)   Console.WriteLine("Is a SuperHero object.");

// Mark object for quick disposalusing (StreamReader reader = File.OpenText("test.txt")) {  string line;  while ((line = reader.ReadLine()) != null)    Console.WriteLine(line);}

VB.NET Structs C#

Structure StudentRecord   Public name As String   Public gpa As Single

  Public Sub New(ByVal name As String, ByVal gpa As Single)     Me.name = name     Me.gpa = gpa   End Sub End Structure

Dim stu As StudentRecord = New StudentRecord("Bob", 3.5) Dim stu2 As StudentRecord = stu  

stu2.name = "Sue" Console.WriteLine(stu.name)    ' Prints Bob

Console.WriteLine(stu2.name)  ' Prints Sue

struct StudentRecord {  public string name;  public float gpa;

  public StudentRecord(string name, float gpa) {    this.name = name;    this.gpa = gpa;  }}

StudentRecord stu = new StudentRecord("Bob", 3.5f);StudentRecord stu2 = stu;  

stu2.name = "Sue";Console.WriteLine(stu.name);    // Prints BobConsole.WriteLine(stu2.name);   // Prints Sue

VB.NET Propert ies C#

' Auto-implemented properties are new to VB10Public Property Name As StringPublic Property Size As Integer = -1     ' Default value, Get and Set both Public

' Traditional property implementationPrivate mName As StringPublic Property Name() As String    Get

// Auto-implemented propertiespublic string Name { get; set; }public int Size { get; protected set; }     // Set default value in constructor

// Traditional property implementationprivate string name;public string Name {  get {    return name;

Page 22: Comparison of C Sharp and Visual Basic

        Return mName    End Get    Set(ByVal value As String)        mName = value    End SetEnd Property

' Read-only propertyPrivate mPowerLevel As IntegerPublic ReadOnly Property PowerLevel() As Integer    Get        Return mPowerLevel    End GetEnd Property

' Write-only propertyPrivate mHeight As DoublePublic WriteOnly Property Height() As Double    Set(ByVal value As Double)        mHeight = If(value < 0, mHeight = 0, mHeight = value)    End SetEnd Property

  }  set {    name = value;  }}

// Read-only propertyprivate int powerLevel;public int PowerLevel {  get {    return powerLevel;  }}

// Write-only propertyprivate double height;public double Height {  set {    height = value < 0 ? 0 : value;  }}

VB.NET Delegates / Events C#

Delegate Sub MsgArrivedEventHandler(ByVal message As String)

Event MsgArrivedEvent As MsgArrivedEventHandler

' or to define an event which declares a delegate implicitlyEvent MsgArrivedEvent(ByVal message As String)

AddHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback ' Won't throw an exception if obj is NothingRaiseEvent MsgArrivedEvent("Test message") RemoveHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback

Imports System.Windows.Forms

Dim WithEvents MyButton As Button   ' WithEvents can't be used on local variableMyButton = New Button

delegate void MsgArrivedEventHandler(string message);

event MsgArrivedEventHandler MsgArrivedEvent;

// Delegates must be used with events in C#

MsgArrivedEvent += new MsgArrivedEventHandler(My_MsgArrivedEventCallback);MsgArrivedEvent("Test message");    // Throws exception if obj is nullMsgArrivedEvent -= new MsgArrivedEventHandler(My_MsgArrivedEventCallback);

using System.Windows.Forms;

Button MyButton = new Button(); MyButton.Click += new

Page 23: Comparison of C Sharp and Visual Basic

Private Sub MyButton_Click(ByVal sender As System.Object, _  ByVal e As System.EventArgs) Handles MyButton.Click   MessageBox.Show(Me, "Button was clicked", "Info", _    MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub

System.EventHandler(MyButton_Click);

private void MyButton_Click(object sender, System.EventArgs e) {   MessageBox.Show(this, "Button was clicked", "Info",     MessageBoxButtons.OK, MessageBoxIcon.Information); }

VB.NET Gener ics C#

' Enforce accepted data type at compile-time Dim numbers As New List(Of Integer)numbers.Add(2)numbers.Add(4)DisplayList(Of Integer)(numbers)

' Subroutine can display any type of List Sub DisplayList(Of T)(ByVal list As List(Of T))    For Each item As T In list        Console.WriteLine(item)    NextEnd Sub

' Class works on any data type Class SillyList(Of T)    Private list(10) As T    Private rand As New Random

    Public Sub Add(ByVal item As T)        list(rand.Next(10)) = item    End Sub

    Public Function GetItem() As T        Return list(rand.Next(10))    End FunctionEnd Class

' Limit T to only types that implement IComparableFunction Maximum(Of T As IComparable)(ByVal ParamArray items As T()) As T    Dim max As T = items(0)    For Each item As T In items        If item.CompareTo(max) > 0 Then max = item    Next    Return maxEnd Function

// Enforce accepted data type at compile-time List<int> numbers = new List<int>();numbers.Add(2);numbers.Add(4);DisplayList<int>(numbers);

// Function can display any type of List void DisplayList<T>(List<T> list) {    foreach (T item in list)        Console.WriteLine(item);}

// Class works on any data type class SillyList<T> {    private T[] list = new T[10];    private Random rand = new Random();

    public void Add(T item) {        list[rand.Next(10)] = item;    }

    public T GetItem() {        return list[rand.Next(10)];    }}

// Limit T to only types that implement IComparableT Maximum<T>(params T[] items) where T : IComparable<T> {    T max = items[0];    foreach (T item in items)        if (item.CompareTo(max) > 0)            max = item;    return max;}

Page 24: Comparison of C Sharp and Visual Basic

VB.NET L INQ C#

Dim nums() As Integer = {5, 8, 2, 1, 6}

' Get all numbers in the array above 4Dim results = From value In nums                  Where value > 4                  Select value

Console.WriteLine(results.Count())     ' 3 Console.WriteLine(results.First())     ' 5 Console.WriteLine(results.Last())     ' 6 Console.WriteLine(results.Average())     ' 6.33333

' Displays 5 8 6 For Each n As Integer In results    Console.Write(n & " ")Next

results = results.Intersect({5, 6, 7})     ' 5 6 results = results.Concat({5, 1, 5})     ' 5 6 5 1 5 results = results.Distinct()     ' 5 6 1

Dim Students() As Student = {    New Student With {.Name = "Bob", .GPA = 3.5},    New Student With {.Name = "Sue", .GPA = 4.0},    New Student With {.Name = "Joe", .GPA = 1.9}}

' Get an ordered list of all students by GPA with GPA >= 3.0Dim goodStudents = From s In Students            Where s.GPA >= 3.0            Order By s.GPA Descending            Select s

Console.WriteLine(goodStudents.First.Name)     ' Sue

int[] nums = { 5, 8, 2, 1, 6 };

// Get all numbers in the array above 4var results = from value in nums                where value > 4                select value;

Console.WriteLine(results.Count());     // 3 Console.WriteLine(results.First());     // 5 Console.WriteLine(results.Last());     // 6 Console.WriteLine(results.Average());     // 6.33333

// Displays 5 8 6 foreach (int n in results)    Console.Write(n + " ");

results = results.Intersect(new[] {5, 6, 7});     // 5 6 results = results.Concat(new[] {5, 1, 5});     // 5 6 5 1 5 results = results.Distinct();     // 5 6 1

Student[] Students = {    new Student{ Name = "Bob", GPA = 3.5 },    new Student{ Name = "Sue", GPA = 4.0 },    new Student{ Name = "Joe", GPA = 1.9 }};

// Get an ordered list of all students by GPA with GPA >= 3.0var goodStudents = from s in Students            where s.GPA >= 3.0            orderby s.GPA descending            select s;

Console.WriteLine(goodStudents.First().Name);   // Sue

VB.NET Conso le I /O C#

Console.Write("What's your name? ") Dim name As String = Console.ReadLine() Console.Write("How old are you? ") Dim age As Integer = Val(Console.ReadLine()) Console.WriteLine("{0} is {1} years old.", name, age) 

Console.Write("What's your name? ");string name = Console.ReadLine();Console.Write("How old are you? ");int age = Convert.ToInt32(Console.ReadLine());Console.WriteLine("{0} is {1} years old.", name, age);// or

Page 25: Comparison of C Sharp and Visual Basic

' or Console.WriteLine(name & " is " & age & " years old.")

Dim c As Integer c = Console.Read()    ' Read single char Console.WriteLine(c)   ' Prints 65 if user enters "A"

Console.WriteLine(name + " is " + age + " years old.");

int c = Console.Read();  // Read single charConsole.WriteLine(c);    // Prints 65 if user enters "A"

VB.NET F i le I /O C#

Imports System.IO

' Write out to text fileDim writer As StreamWriter = File.CreateText("c:\myfile.txt") writer.WriteLine("Out to file.") writer.Close()

' Read all lines from text fileDim reader As StreamReader = File.OpenText("c:\myfile.txt") Dim line As String = reader.ReadLine() While Not line Is Nothing   Console.WriteLine(line)   line = reader.ReadLine() End While reader.Close()

' Write out to binary fileDim str As String = "Text data" Dim num As Integer = 123 Dim binWriter As New BinaryWriter(File.OpenWrite("c:\myfile.dat"))  binWriter.Write(str)  binWriter.Write(num) binWriter.Close()

' Read from binary fileDim binReader As New BinaryReader(File.OpenRead("c:\myfile.dat")) str = binReader.ReadString() num = binReader.ReadInt32() binReader.Close()

using System.IO;

// Write out to text fileStreamWriter writer = File.CreateText("c:\\myfile.txt"); writer.WriteLine("Out to file."); writer.Close();

// Read all lines from text fileStreamReader reader = File.OpenText("c:\\myfile.txt"); string line = reader.ReadLine(); while (line != null) {  Console.WriteLine(line);   line = reader.ReadLine(); } reader.Close();

// Write out to binary filestring str = "Text data"; int num = 123; BinaryWriter binWriter = new BinaryWriter(File.OpenWrite("c:\\myfile.dat")); binWriter.Write(str); binWriter.Write(num); binWriter.Close();

// Read from binary fileBinaryReader binReader = new BinaryReader(File.OpenRead("c:\\myfile.dat")); str = binReader.ReadString(); num = binReader.ReadInt32(); binReader.Close();