[go: up one dir, main page]

0% found this document useful (0 votes)
351 views16 pages

Clarion Sharp Comparison

This document compares the key syntactical differences between C#, Clarion#, and VB.NET in areas like program structure, comments, data types, constants, operators, and control flow statements. It provides code examples to highlight how similar functionality is implemented differently across the languages. Clarion# is noted to still be in alpha testing so some details may change.

Uploaded by

Numi Moja
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
351 views16 pages

Clarion Sharp Comparison

This document compares the key syntactical differences between C#, Clarion#, and VB.NET in areas like program structure, comments, data types, constants, operators, and control flow statements. It provides code examples to highlight how similar functionality is implemented differently across the languages. Clarion# is noted to still be in alpha testing so some details may change.

Uploaded by

Numi Moja
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 16

Comparison of C#, Clarion# and VB.

NET
This is a quick reference guide to highlight some key syntactical differences between C#, Clarion# and VB.NET (version 2).
NOTE: Clarion.NET and the Clarion# language are currently in alpha test, and various areas of the documentation are incomplete and in a state of flux. Therefore, its very likely that some of the entries will change as new information becomes available.

Program Structure
C#
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 + "!"); } } } PROGRAM NAMESPACE Hello USING System MAP END Name STRING CODE Name = 'Clarion#' !See if an argument was passed from the command line IF COMMAND('1') <> '' Name = COMMAND('1') END Console.WriteLine('Hello, ' & Name & '!') '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

Clarion#
Imports System

VB.NET

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

Comments
C#
//Single line !Single line

Clarion#
'Single line only REM Single line only

VB.NET

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

!~ Multiple lines ~! !!!<summary>XML comments on single line</summary> !!!<summary> !!! XML comments on multiple lines !!!</summary> '''<summary>XML comments</summary>

Data Types
C#
// Value Types bool byte, sbyte char short, ushort, int, uint, long, ulong float, double decimal DateTime //not a built-in C# type // Reference Types object string

Clarion#
! Value Types BOOL BYTE, SBYTE CHAR, CSTRING, PSTRING, CLASTRING SHORT, USHORT, SIGNED, UNSIGNED, LONG, ULONG, CLALONG SREAL, REAL, BFLOAT4, BFLOAT8 DECIMAL, PDECIMAL, CLADECIMAL DATE, TIME, CLADATE, CLATIME ! Reference Types OBJECT STRING &BYTE !References to Value Types require & ! Initializing !Within DATA section Correct BOOL(TRUE) H BYTE(02Ah) !hex O BYTE(052o) !octal B BYTE(01101b) !binary Person OBJECT Name STRING Name = 'Mike' Grade CHAR('B') Today DATE Today = DATE(12,31,2007) Amount DECIMAL(35.99) GPA SREAL(2.9) Pi REAL(3.14159265) lTotal LONG(123456) sTotal SHORT(123) usTotal USHORT(123) uiTotal UNSIGNED(123) ulTotal ULONG(123)

VB.NET
' Value Types Boolean Byte, SByte Char Short, UShort, Integer, UInteger, Long, ULong Single, Double Decimal Date ' Reference Types Object String

// Initializing bool correct = true; byte b = 0x2A; //hex object person = null; string name = "Mike"; char grade = 'B'; DateTime today = DateTime.Parse("12/31/2007 12:15:00"); 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;

!Within CODE section Correct OF BOOL = TRUE H OF BYTE = 02Ah O OF BYTE = 052o B OF BYTE = 01101b Person OF OBJECT Name OF STRING = 'Mike' Grade OF CHAR('B') Today OF DATE = DATE(12,31,2007) Amount OF DECIMAL = 35.99 GPA OF SREAL = 2.9 Pi OF REAL = 3.14159265 lTotal OF LONG = 123456 sTotal OF SHORT = 123 usTotal OF USHORT = 123 uiTotal OF UNSIGNED = 123 ulTotal OF ULONG = 123

' Initializing Dim correct As Boolean = True Dim b As Byte = &H2A 'hex Dim o As Byte = &O52 'octal Dim person As Object = Nothing Dim name As String = "Mike" Dim grade As Char = "B"c Dim today As Date = #12/31/2007 12:15:00 PM# Dim amount As Decimal = 35.99@ Dim gpa As Single = 2.9! Dim pi As Double = 3.14159265 Dim lTotal As Long = 123456L Dim sTotal As Short = 123S Dim usTotal As UShort = 123US Dim uiTotal As UInteger = 123UI Dim ulTotal As ULong = 123UL

// Type Information int x; Console.WriteLine(x.GetType()); Console.WriteLine(typeof(int)); Console.WriteLine(x.GetType().Name); // Type Conversion float d = 3.5f; int i = (int)d;

//Prints System.Int32 //Prints System.Int32 //Prints Int32

! Type Information X SIGNED Console.WriteLine(X.GetType()) Console.WriteLine(TYPEOF(SIGNED)) Console.WriteLine(X.GetType().Name) ! Type Conversion D SREAL(3.5) I SIGNED I = D I = INT(D) I = D TRYAS SIGNED

!Prints System.Int32 !Prints System.Int32 !Prints Int32

' Type Information Dim x As Integer Console.WriteLine(x.GetType()) Console.WriteLine(GetType(Integer)) Console.WriteLine(TypeName(x))

'Prints System.Int32 'Prints System.Int32 'Prints Integer

//set to 3 (truncates decimal)

!Implicitly truncate to 3 !Explicitly truncate to 3 !Explicitly truncate to 3 (may generate exception)

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

Constants
C#
const int MAX_STUDENTS = 25; // Can set to a const or var; may be initialized in a constructor readonly float MIN_DIAMETER = 4.93f;

Clarion#
! CONST and READONLY unsupported, although they can be simulated using ! properties with the GETONLY attribute. Also consider EQUATEs. MAX_STUDENTS EQUATE(25) !Instead of CONST; will auto-convert MIN_DIAMETER SREAL(4.93) !READONLY is unsupported

VB.NET
Const MAX_STUDENTS As Integer = 25 'Can set to a const or var; may be initialized in a constructor ReadOnly MIN_DIAMETER As Single = 4.93

Enumerations
C#
enum Action {Start, Stop, Rewind, Forward}; Action ENUM Start ITEM Stop ITEM Rewind ITEM Forward ITEM END Status ENUM Flunk(50) Pass (70) Excel(90) END

Clarion#
Action ENUM !Alternate syntax Start Stop Rewind Forward END Enum Action Start [Stop] 'Stop is a reserved word Rewind Forward End Enum Enum Status Flunk = 50 Pass = 70 Excel = 90 End Enum

VB.NET

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); Console.WriteLine(Status.Pass); //Prints 70 //Prints Pass

Action(Action.Stop) IF (A <> Action.Start) Console.WriteLine(A.ToString() & 'is ' & A) !Prints "Stop is 1" END Console.WriteLine(Status.Pass + 0) !Prints 70 Console.WriteLine(Status.Pass) !Prints Pass

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

'Prints "Stop is 1" 'Prints 70 'Prints Pass

Operators
C#
// Comparison == < > <= >= // Arithmetic + - * / % / Math.Pow(x, y) // Assignment = += -= *= // Bitwise & | ^ != ! Comparison = < > <= >= ~= <> &=

Clarion#
' Comparison = < > <= >= <>

VB.NET

//mod //integer division if both operands are ints //raise to a power

! Arithmetic + - * / % !mod / !integer division ^ !raise to a power ! Assignment = += -= *=

' Arithmetic + - * / Mod \ 'integer division ^ 'raise to a power ' Assignment = += -= *= ' Bitwise And Or

/=

%=

&=

|=

^=

<<=

>>=

++

--

/=

%=

&=

/=

\=

^=

<<=

>>=

&=

<<

>>

! Bitwise BAND(val,mask) BOR(val,mask) BXOR(val,mask) BSHIFT(val,count)

Xor

Not

<<

>>

// Logical && ||

&

! Logical AND OR XOR NOT ! Note: AND and OR perform short-circuit logical evaluations ! String Concatenation &

' Logical AndAlso

OrElse

And

Or

Xor

Not

// Note: && and || perform short-circuit logical evaluations // String Concatenation +

' Note: AndAlso and OrElse perform short-circuit logical evaluations ' String Concatenation &

Choices
C#
greeting = age < 20 ? "What's up?" : "Hello"; if (age < 20) greeting = "What's up?"; else greeting = "Hello"; // Semi-colon ";" is used to terminate each statement, // so no line continuation character is necessary.

Clarion#
Greeting = CHOOSE(Age < 20, 'What''s up?', 'Hello') ! One line requires THEN (or ;) IF Age < 20 THEN Greeting = 'What''s up?' END IF Age < 20; Greeting = 'What''s up?'ELSE Greeting = 'Hello' END ! Use semi-colon (;) to put two commands on same line. ! A period (.) may replace END in single line constructs, ! but it is discouraged for multi-line constructs. IF X <> 100 AND Y < 5 THEN X *= 5; Y *= 2. !Period is OK here

VB.NET
greeting = IIf(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 colon (:) to put two commands on same line If x <> 100 AndAlso y < 5 Then x *= 5 : y *= 2

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

! Multi-line is more readable (THEN is optional on multi line) IF X <> 100 AND Y < 5 THEN IF X <> 100 AND Y < 5 X *= 5 X *= 5 Y *= 2 Y *= 2 END . !Period is hard to see here ! To break up any long single line use | (pipe) IF WhenYouHaveAReally < LongLine | AND ItNeedsToBeBrokenInto2 > Lines UseThePipe(CharToBreakItUp) END

' Multi-line is more readable If x <> 100 AndAlso y < 5 Then x *= 5 y *= 2 End If ' To break up any long single line use _ If whenYouHaveAReally < longLine AndAlso _ itNeedsToBeBrokenInto2 > Lines Then _ UseTheUnderscore(charToBreakItUp) If x > x *= ElseIf x += ElseIf x -= Else x /= End If 5 Then y x = 5 Then y x < 10 Then y y

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

IF X > 5 X *= Y ELSIF X = 5 X += Y ELSIF X < 10 X -= Y ELSE X /= Y END

// 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 }

CASE Color OF 'pink' OROF 'red' R += 1 OF 'blue' B += 1 OF 'green' G += 1 ELSE Other += 1 END

!Any data type or expression

Select Case color Case "pink", "red" r += 1 Case "blue" b += 1 Case "green" g += 1 Case Else other += 1 End Select

'Must be a primitive data type

CASE Value OF 0.00 TO 9.99; OF 10.00 TO 99.99; OF 100.00 TO 999.99; !etc. ELSE ; END EXECUTE Stage Stage1 Stage2 Stage3 ELSE StageOther END

RangeName = 'Ones' RangeName = 'Tens' RangeName = 'Hundreds' RangeName = 'Zillions'

!Integer value or expression ! expression equals 1 ! expression equals 2 ! expression equals 3 ! expression equals some other value

Loops
C#
// Pre-test Loops while (c < 10) c++; // no "until" keyword for (c = 2; c <= 10; c += 2) Console.WriteLine(c); // Post-test Loop do c++; while (c < 10); // Untested Loop for (;;) { //break logic inside } ! Post-test Loops LOOP C += 1 WHILE c < 10 ! Untested Loops LOOP !Break logic inside END ! Pre-test Loops LOOP WHILE C < 10 C += 1 END

Clarion#
LOOP UNTIL C = 10 C += 1 END LOOP C = 2 TO 10 BY 2 Console.WriteLine(C) END ' Pre-test Loops While c < 10 c += 1 End While Do While c < 10 c += 1 Loop ' Post-test Loops Do c += 1 Loop While c < 10 ' Untested Loop Do //break logic inside Loop

VB.NET
Do Until c = 10 c += 1 Loop For c = 2 To 10 Step 2 Console.WriteLine(c) Next

LOOP C += 1 UNTIL C = 10

Do c += 1 Loop Until c = 10

LOOP 3 TIMES Console.WriteLine END

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

! Array or collection looping Names STRING,DIM(3) S STRING CODE Names[0] = 'Fred'; Names[1] = 'Sue'; Names[2] = 'Barney' FOREACH S IN Names Console.WriteLine(S) END ! Breaking out of loops I SHORT(0) CODE LOOP IF I = 5 THEN BREAK. I += 1 END ! Continue to next iteration LOOP I = 0 TO 4 IF I < 4 THEN CYCLE. Console.WriteLine(I) END

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

// Breaking out of loops int i = 0; while (true) { if (i == 5) break; i++; } // Continue to next iteration for (i = 0; i < 5; i++) { if (i < 4) continue; Console.WriteLine(i); //Only prints 4 }

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

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

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

Clarion#
SIGNED,DIM(3) SIGNED CODE Nums[0] = 1; Nums[1] = 2; Nums[2] = 3 LOOP I = 0 TO Nums.Length - 1 Console.WriteLine(Nums[I]) END

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

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

! 5 is the size of the array Names STRING,DIM(5) CODE Names[0] = 'David' Names[5] = 'Bobby' !Caught by compiler I = 5 Names[I] = 'Bobby' !Throws System.IndexOutOfRangeException ! Clarion# can't dynamically resize arrays, so copy into new array Names2 STRING[] CODE Names2 = NEW STRING[7] Array.Copy(Names, Names2, Names.Length) !or Names.CopyTo(Names2, 0) TwoD SREAL[,] CODE TwoD = NEW SREAL[Rows, Cols] TwoD[2,0] = 4.5

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

// C# can't dynamically resize arrays, so 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;

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

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

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

! Jagged arrays unsupported

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

Functions
C#
// 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; }

Clarion#
! Pass by value(in,default), reference(in/out), and reference(out) TestFunc PROCEDURE(SIGNED X, *SIGNED Y, *SIGNED Z) CODE X += 1 Y += 1 Z = 5 RETURN !Optional, if not returning a value A UNSIGNED(1) B UNSIGNED(1) C UNSIGNED !C doesnt need initializing CODE TestFunc(A, B, C) Console.WriteLine('{{0} {{1} {{2}', A, B, C) ! Accept variable number of arguments Sum PROCEDURE(PARAMS UNSIGNED[] Nums),UNSIGNED Result UNSIGNED(0) I UNSIGNED CODE FOREACH I IN Nums Result += I END RETURN Result Total# = Sum(4, 3, 2, 1) !returns 10

VB.NET
' 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

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

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 !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 'Or use Return statement like C# End Function Dim total As Integer = Sum(4, 3, 2, 1) 'returns 10

// Accept variable number of arguments int 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# doesn't support optional arguments/parameters. Just create two different versions of the same function. */ void SayHello(string name, string prefix) { Console.WriteLine("Greetings, " + prefix + " " + name); } void SayHello(string name) { SayHello(name, ""); }

! Optional parameters without default value ! (When omitted, value parameters default to 0 or an empty string) ! (Use OMITTED to detect the omission) SayHello PROCEDURE(STRING Name, <STRING Prefix>) ! Optional parameters with default value ! (Valid only on simple numeric types) ! (OMITTED will not detect the omission the default is passed) SayHello PROCEDURE(STRING Name, BYTE Age = 20)

' Optional parameters must be listed last and 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("Madonna")

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

Clarion#
! Special Characters <13> !carriage-return <10> !line-feed <9> !tab <n> !character with the ASCII value=n (see above) << !less-than {{ !left-curly-brace !single-quote '' {n} !Repeat previous character "n" times ! String concatenation School STRING Univ CLASTRING('University') !Clarion string class CODE School = 'Harding<9>' School = School & Univ !School is "Harding(tab)University" ! Chars Letter CHAR Word CHAR[] CODE Letter Letter Letter Word ' Special Character Constants vbCrLf, vbCr, vbLf, vbNewLine vbNullString vbTab vbBack vbFormFeed vbVerticalTab ""

VB.NET

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

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

// Chars char letter = school[0]; letter = Convert.ToChar(65); letter = (char)65; char[] word = school.ToCharArray();

//letter is H //letter is A //same thing //word holds Harding

= = = =

School[1] Convert.ToChar(65) '<65>' School.ToCharArray

!Letter is H !Letter is A !Same thing !Word holds Harding

' Chars Dim letter As Char = school.Chars(0) letter = Convert.ToChar(65) letter = Chr(65) Dim word() As Char = school.ToCharArray()

'letter is H 'letter is A 'same thing 'word holds Harding

// String literal string msg = @"File is c:\temp\x.dat"; // same as string msg = "File is c:\\temp\\x.dat"; // String comparison string mascot = "Bisons"; if (mascot == "Bisons") if (mascot.Equals("Bisons")) if (mascot.ToUpper().Equals("BISONS")) if (mascot.CompareTo("Bisons") == 0)

! No string literal operator Msg STRING CODE Msg = 'File is c:\temp\x.dat' ! String comparison Mascot STRING CODE Mascot = 'Bisons' IF Mascot = 'Bisons' IF Mascot.Equals('Bisons') IF Mascot.ToUpper().Equals('BISONS') IF UPPER(Mascot) = 'BISONS' IF Mascot.CompareTo('Bisons') = 0 ! Substring Console.WriteLine(Mascot.Substring(2, 3)) Console.WriteLine(SUB(Mascot, 3, 3)) Console.WriteLine(Mascot[3 : 6])

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

//true //true //true //true

!true !true !true !true !true

' String comparison Dim mascot As String = "Bisons" If (mascot = "Bisons") Then If (mascot.Equals("Bisons")) Then If (mascot.ToUpper().Equals("BISONS")) Then If (mascot.CompareTo("Bisons") = 0) Then

'true 'true 'true 'true

// Substring Console.WriteLine(mascot.Substring(2, 3));

//Prints "son"

!Prints "son" !Prints "son" !Prints "son"

' Substring Console.WriteLine(mascot.Substring(2, 3)) 'Prints "son"

// String matching // No exact equivalent to Like - use regular expressions using System.Text.RegularExpressions; Regex r = new Regex(@"Jo[hH]. \d:*"); if (r.Match("John 3:16").Success) //true

! String matching ! No exact equivalent to Like - use regular expressions or MATCH R A B C USING System.Text.RegularExpressions Regex STRING STRING STRING CODE R = NEW Regex('Jo[hH]. \d:*') IF R.Match('John 3:16').Success !true A = 'Richard' B = 'RICHARD' C = 'R*' IF MATCH(A,B,MATCH:Simple+Match:NoCase) !true: case insensitive IF MATCH(A,B,MATCH:Soundex) !true: soundex IF MATCH(A,C) !true: wildcard (default) IF MATCH('Fireworks on the fourth', '{{4|four}th', | MATCH:Regular+Match:NoCase) !true: RegEx IF MATCH('July 4th fireworks', '{{4|four}th', | !true: RegEx MATCH:Regular+Match:NoCase)

' String matching If ("John 3:16" Like "Jo[Hh]? #:*") Then Imports System.Text.RegularExpressions Dim r As New Regex("Jo[hH]. \d:*") If (r.Match("John 3:16").Success) Then

'true 'More powerful than Like 'true

// My birthday: Sep 3, 1964 DateTime dt = new DateTime(1964, 9, 3); string s = "My birthday: " + dt.ToString("MMM dd, yyyy");

! My birthday: Sep 3, 1964 DT DateTime S STRING CODE DT = NEW DateTime(1964, 9, 3) S = 'My birthday: ' & DT.ToString('MMM dd, yyyy') ! Mutable string Buffer System.Text.StringBuilder('two ') CODE Buffer.Append('three ') Buffer.Insert(0, 'one ') Buffer.Replace('two', 'TWO') Console.WriteLine(Buffer) !Prints "one TWO three"

' My birthday: Sep 3, 1964 Dim dt As New DateTime(1964, 9, 3) Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy")

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

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

Exception Handling
C#
// Throw an exception Exception ex = new Exception("Something is really wrong."); throw ex;

Clarion#
! Throw an exception Ex Exception('Something is really wrong.') CODE THROW Ex

VB.NET
' Throw an exception Dim ex As New Exception("Something is really wrong.") Throw ex

// Catch an exception try { y = 0; x = 10 / y; } catch (Exception ex) { //Argument is optional, no "When" keyword Console.WriteLine(ex.Message); } finally { //Requires reference to the Microsoft.VisualBasic.dll //assembly (pre .NET Framework v2.0) Microsoft.VisualBasic.Interaction.Beep(); }

! Catch an exception TRY y = 0; x = 10 / y; CATCH(Exception Ex) !Argument is optional, no "When" keyword Console.WriteLine(Ex.Message); FINALLY BEEP END

' Catch an exception Try y = 0 x = 10 / y Catch ex As Exception When y = 0 'Argument and When is optional Console.WriteLine(ex.Message) Finally Beep() End Try ' Deprecated unstructured error handling On Error GoTo MyErrorHandler ... MyErrorHandler: Console.WriteLine(Err.Description)

Namespaces
C#
namespace Harding.Compsci.Graphics { ... } // or namespace Harding { namespace Compsci { namespace Graphics { ... } } } using Harding.Compsci.Graphics; ! Progressive, nested namespaces unsupported

Clarion#
NAMESPACE Harding.Compsci.Graphics

VB.NET
Namespace Harding.Compsci.Graphics ... End Namespace ' or Namespace Harding Namespace Compsci Namespace Graphics ... End Namespace End Namespace End Namespace Imports Harding.Compsci.Graphics

USING Harding.Compsci.Graphics

Classes / Interfaces
C#
// Accessibility keywords public private internal protected protected internal static // Inheritance class FootballGame : Competition { ... } ! Accessibility keywords PUBLIC PRIVATE INTERNAL PROTECTED PROTECTED INTERNAL STATIC ! Inheritance FootballGame CLASS(Competition) ... END

Clarion#
' Accessibility keywords Public Private Friend Protected Protected Friend Shared ' Inheritance Class FootballGame Inherits Competition ... End Class

VB.NET

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

! Interface definition IAlarmClock INTERFACE ... END ! Extending an interface IAlarmClock INTERFACE(IClock) ... END

' Interface definition Interface IAlarmClock ... End Interface ' Extending an interface Interface IAlarmClock Inherits IClock ... End Interface ' Interface implementation Class WristWatch Implements IAlarmClock, ITimer ... End Class

// Interface implementation class WristWatch : IAlarmClock, ITimer { ... }

! Interface implementation WristWatch CLASS,IMPLEMENTS(IAlarmClock),IMPLEMENTS(ITimer) ... END

Constructors / Destructors
C#
class SuperHero { private int _powerLevel; public SuperHero() { _powerLevel = 0; } public SuperHero(int powerLevel) { this._powerLevel= powerLevel; } ~SuperHero() { //Destructor code to free unmanaged resources. //Implicitly creates a Finalize method } }

Clarion#
SuperHero CLASS _PowerLevel UNSIGNED,PRIVATE Construct PROCEDURE,PUBLIC Construct PROCEDURE(UNSIGNED PowerLevel),PUBLIC Destruct PROCEDURE END SuperHero.Construct PROCEDURE CODE SELF._PowerLevel = 0 SuperHero.Construct PROCEDURE(UNSIGNED PowerLevel) CODE SELF._PowerLevel = PowerLevel SuperHero.Destruct PROCEDURE CODE !Destructor code to free unmanaged resources. ! Using INLINE SuperHero CLASS _PowerLevel UNSIGNED,PRIVATE Construct PROCEDURE,PUBLIC INLINE CODE SELF._PowerLevel = 0 END Construct PROCEDURE(UNSIGNED PowerLevel),PUBLIC INLINE CODE SELF._PowerLevel = PowerLevel END Destruct PROCEDURE INLINE CODE !Destructor code to free unmanaged resources. END END Class SuperHero Private _powerLevel As Integer Public Sub New() _powerLevel = 0 End Sub

VB.NET

Public Sub New(ByVal powerLevel As Integer) Me._powerLevel = powerLevel End Sub Protected Overrides Sub Finalize() 'Destructor code to free unmanaged resources MyBase.Finalize() End Sub End Class

Using Objects
C#
SuperHero hero = new SuperHero(); Hero SuperHero Hero2 SuperHero Obj Object CODE Hero = NEW SuperHero

Clarion#

VB.NET
Dim hero As SuperHero = New SuperHero 'or Dim hero As New SuperHero

// No "With" construct hero.Name = "SpamMan"; hero.PowerLevel = 3; hero.Defend("Laura Jones"); SuperHero.Rest();

! No "With" construct hero.Name = 'SpamMan' hero.PowerLevel = 3 Hero.Defend('Laura Jones') SuperHero.Rest()

With hero .Name = "SpamMan" .PowerLevel = 3 End With hero.Defend("Laura Jones") hero.Rest() 'Calling Shared method 'or SuperHero.Rest() Dim hero2 As SuperHero = hero hero2.Name = "WormWoman" Console.WriteLine(hero.Name) hero = Nothing If hero Is Nothing Then _ hero = New SuperHero Dim obj As Object = New SuperHero If TypeOf obj Is SuperHero Then _ Console.WriteLine("Is a SuperHero object.") 'Both reference the same object 'Prints WormWoman 'Free the object

//Calling static method

!Calling static method

SuperHero hero2 = hero; hero2.Name = "WormWoman"; Console.WriteLine(hero.Name); hero = null ; if (hero == null) hero = new SuperHero();

//Both reference the same object //Prints WormWoman //Free the object

Hero2 = Hero Hero2.Name = 'WormWoman' Console.WriteLine(Hero.Name) Hero = NULL IF Hero = NULL Hero = NEW SuperHero END

!Both reference the same object !Prints "WormWoman" !Free the object

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

Obj = NEW SuperHero(); IF Obj IS SuperHero Console.WriteLine('Is a SuperHero object.') END ! Mark object for quick disposal reader StreamReader,AUTODISPOSE line STRING CODE reader = File.OpenText('test.txt') LOOP line = reader.ReadLine() IF line &= NULL THEN BREAK. Console.WriteLine(line) END

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

' Mark object for quick disposal Using reader As StreamReader = File.OpenText("test.txt") Dim line As String Do line = reader.ReadLine() If line Is Nothing Then Exit Do Console.WriteLine(line) Loop End Using

Structs
C#
struct StudentRecord { public string name; public float gpa; public StudentRecord(string name, float gpa) { this.name = name; this.gpa = gpa; } }

Clarion#
StudentRecord STRUCT Name STRING,PUBLIC GPA SREAL,PUBLIC Construct PROCEDURE(STRING Name,SREAL GPA),PUBLIC INLINE CODE SELF.Name = Name SELF.GPA = GPA END END Structure StudentRecord Public name As String Public gpa As Single

VB.NET

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

StudentRecord stu = new StudentRecord("Bob", 3.5f); StudentRecord stu2 = stu; stu2.name = "Sue"; Console.WriteLine(stu.name); Console.WriteLine(stu2.name);

//Prints Bob //Prints Sue

Stu StudentRecord('Bob', 3.5) Stu2 StudentRecord CODE Stu2.Name = 'Sue' Console.WriteLine(Stu.Name) Console.WriteLine(Stu2.Name)

Dim stu As StudentRecord = New StudentRecord("Bob", 3.5) Dim stu2 As StudentRecord = stu stu2.name = "Sue" Console.WriteLine(stu.name) Console.WriteLine(stu2.name)

!Prints Bob !Prints Sue

'Prints Bob 'Prints Sue

Properties
C#
private int _size; public int Size { get { return _size; } set { //parameter is always "value" if (value < 0) _size = 0; else _size = value; } }

Clarion#
_Size UNSIGNED,PRIVATE Size PROPERTY,UNSIGNED,PUBLIC INLINE GETTER CODE RETURN SELF._Size SETTER !parameter is always "Value" CODE IF Value < 0 SELF._Size = 0 ELSE SELF._Size = Value END END ! Rather than use INLINE in the class definition, you may define Get_PropertyName ! and Set_PropertyName methods separately in the code section: ClassName.Get_Size PROCEDURE CODE RETURN SELF._Size ClassName.Set_Size PROCEDURE(UNSIGNED pValue) CODE SELF._Size = CHOOSE(pValue < 0, 0, pValue) Private _size As Integer

VB.NET

Public Property Size() As Integer Get Return _size End Get Set (ByVal Value As Integer) If Value < 0 Then _size = 0 Else _size = Value End If End Set End Property

// Usage foo.Size++;

! Usage Foo.Size += 1

' Usage foo.Size += 1

Delegates / Events
C#
delegate void MsgArrivedEventHandler(string message); event MsgArrivedEventHandler MsgArrivedEvent; // Events must use explicitly-defined delegates in C#

Clarion#
MAP MsgArrivedEventHandler PROCEDURE(STRING Message),DELEGATE END MsgArrivedEvent EVENT,MsgArrivedEventHandler ! Events must use explicitly-defined delegates in Clarion#

VB.NET
Delegate Sub MsgArrivedEventHandler(ByVal message As String) Event MsgArrivedEvent As MsgArrivedEventHandler ' or to define an event which declares a delegate implicitly Event MsgArrivedEvent(ByVal message As String)

MsgArrivedEvent += new MsgArrivedEventHandler(My_MsgArrivedEventCallback); MsgArrivedEvent("Test message"); //Throws exception if obj is null MsgArrivedEvent -= new MsgArrivedEventHandler(My_MsgArrivedEventCallback); using System; using System.Windows.Forms; public class MyClass { Button MyButton;

MsgArrivedEvent += My_MsgArrivedEventCallback MsgArrivedEvent('Test message') MsgArrivedEvent -= My_MsgArrivedEventCallback

AddHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback ' Won't throw an exception if obj is Nothing RaiseEvent MsgArrivedEvent("Test message") RemoveHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback Imports System Imports System.Windows.Forms Public Class MyForm Dim WithEvents MyButton As Button

USING System USING System.Windows.Forms MyForm CLASS,TYPE,NETCLASS,PARTIAL MyButton Button Init PROCEDURE MyButton_Click PROCEDURE(Object Sender, EventArgs E) END MyForm.Init PROCEDURE CODE MyButton = NEW Button SELF.MyButton.Click += SELF.MyButton_Click MyForm.MyButton_Click PROCEDURE(Object Sender, EventArgs E) CODE MessageBox.Show('Button was clicked', 'Info', | MessageBoxButtons.OK, MessageBoxIcon.Information)

public void Init() { MyButton = new Button(); MyButton.Click += new EventHandler(MyButton_Click); } private void MyButton_Click(object sender, EventArgs e) { MessageBox.Show("Button was clicked", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); } }

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

Console I/O
C# Clarion#
Name STRING Age UNSIGNED C UNSIGNED CODE Console.Write('What's your name? ') Name = Console.ReadLine() Console.Write('How old are you? ') Age = Convert.ToInt32(Console.ReadLine()) Console.WriteLine("{{0} is {{1} years old.", Name, Age); ! or Console.WriteLine(Name + 'is '+ age + 'years old.');

VB.NET

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 Console.WriteLine(name + " is " + age + " years old.");

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) ' or Console.WriteLine(name & " is " & age & " years old.") Dim c As Integer c = Console.Read() Console.WriteLine(c)

int c = Console.Read(); Console.WriteLine(c);

//Read single char //Prints 65 if user enters "A"

C = Console.Read() Console.WriteLine(C)

!Read single char !Prints 65 if user enters "A"

'Read single char 'Prints 65 if user enters "A"

File I/O
C#
using System.IO; // Write out to text file StreamWriter writer = File.CreateText("c:\\myfile.txt"); writer.WriteLine("Out to file."); writer.Close(); USING System.IO ! Write out to text file Writer StreamWriter CODE Writer = File.CreateText('c:\myfile.txt') Writer.WriteLine('Out to file.') Writer.Close() ! Read all lines from text file Reader StreamReader Line STRING CODE Reader = File.OpenText('c:\myfile.txt') LOOP Line = Reader.ReadLine() IF Line &= NULL THEN BREAK. Console.WriteLine(Line) END Reader.Close() ! Write out to binary file Str STRING Num SIGNED(123) BinWriter BinaryWriter CODE Str = 'Text data' BinWriter = NEW BinaryWriter(File.OpenWrite('c:\myfile.dat')) BinWriter.Write(Str) BinWriter.Write(Num) BinWriter.Close() ! Read from binary file BinReader BinaryReader CODE BinReader = NEW BinaryReader(File.OpenRead('c:\myfile.dat')) Str = BinReader.ReadString() Num = BinReader.ReadInt32() BinReader.Close()

Clarion#
Imports System.IO

VB.NET

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

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

' Read all lines from text file Dim reader As StreamReader = File.OpenText("c:\myfile.txt") Dim line As String Do line = reader.ReadLine() IF line Is Nothing Then Exit Do Console.WriteLine(line) Loop reader.Close()

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

' Write out to binary file Dim 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 file BinaryReader binReader = new BinaryReader(File.OpenRead("c:\\myfile.dat")); str = binReader.ReadString(); num = binReader.ReadInt32(); binReader.Close();

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

Based upon a document by Frank McCown (www.harding.edu/fmccown/vbnet_csharp_comparison.html). Licensed under a Creative Commons License (creativecommons.org/licenses/by-sa/2.0). Clarion# examples provided by Mike Hanson (www.boxsoft.net). Last updated April 17, 2008.

You might also like