.net COBOL、Visual Basic 和 C# 的比较






4.72/5 (18投票s)
一个简单的表格,展示了这三种语言之间的语法转换。
引言
如果您是一名 COBOL 程序员,希望学习 C#,或者是一名 VB 程序员,希望学习 .net 语言的 COBOL(或者 VB.net、C# 和 COBOL 的任何其他组合),那么这是一个很好的起点。
背景
经常有人指出,Micro Focus .net 实现中 COBOL 语言的丰富性并不为人所知。Robert Sales 和我共同编写本文档,旨在引起人们对该语言的关注,并帮助需要在 .net 平台上使用 COBOL 的人。
使用代码
所有示例都应该可以在相应的 Visual Studio IDE 中工作。您可以在这里获得免费版本:http://download.cnet.com/Net-Express-with-NET/3000-2069_4-10866201.html?part=dl-10866201&subj=dl&tag=button。
VB.NET | C# | COBOL |
---|---|---|
程序结构 | ||
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) End If Console.WriteLine("Hello, " & name & "!") End Sub End Class End Namespace End Class |
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 + "!"); } } } |
$set sourceformat(free) $set ilusing"System" *> Note, no direct syntax for specifying a default namespace; class-id. HelloWorld as "Hello.Helloworld". static. method-id. Main. local-storage section. 01 nam string. procedure division using by value args as string occurs any. *> See if an argument was passed from the command line if args::"Length" = 1 set nam to args(1) end-if display "Hello, ", nam, "!" *> or, if preferred... invoke type "Console"::"WriteLine"(string::"Concat"("Hello, ", nam, "!")) end method Main. end static. end class HelloWorld. |
注释 | ||
' Single line only REM 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> */</span> |
* Single line only, "old-style" COBOL comment with '*' in column 7 *> inline comment may follow Cobol statements etc. *>> <summary>XML comments</summary> |
数据类型 | ||
Value Types Boolean Byte, SByte Char Short, UShort, Integer, UInteger, Long, ULong Single, Double Decimal Date Reference Types Object String 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 = "Dwight" 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 Dim x As Integer Console.WriteLine(x.GetType()) ' Prints System.Int32 Console.WriteLine(GetType(Integer)) ' Prints System.Int32 Console.WriteLine(TypeName(x)) ' Prints Integer 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) |
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 Initializing bool correct = true; byte b = 0x2A; // hex object person = null; string name = "Dwight"; 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; Type Information int x; Console.WriteLine(x.GetType()); // Prints System.Int32 Console.WriteLine(typeof(int)); // Prints System.Int32 Console.WriteLine(x.GetType().Name); // prints Int32 Type Conversion float d = 3.5f; int i = (int)d; // set to 3 (truncates decimal) |
Value Types condition-value binary-char (unsigned) character binary-short, binary-long, binary-double (unsigned) float-short, float-long decimal DateTime (not a built-in COBOL type Reference types object string Initializing 01 correct condition-value value true. 01 b binary-char unsigned value h"2a". *> Hex 01 o binary-char ussigned value o"52". *> Octal 01 person object value null. 01 nam string value "Dwight". 01 grade character value "B". 01 today type "DateTime" value type "DateTime"::"Parse"("12/31/2007 12:15:00"). 01 amount decimal value 35.99. 01 gpa float-short value 2.9. 01 pi float-long value 3.14159265. 01 lTotal binary-double value 123456. 01 sTotal binary-short value 123. 01 usTotal binary-short unsigned value 123. 01 uiTotal binary-long value 123. 01 ulTotal binary-long unsigned value 123. Type Information 01 x binary-long. display x::"GetType" *> Prints System.Int32 display type of binary-long *> Prints System.Int32 display x::"GetType"::"Name" *> Prints Int32 Type Conversion 01 d float-short value 3.5. *> automatic conversion set i to d as binary-long *> set to 3 (truncates decimal) COBOL types not supported in C# or VB.Net *> Only a few examples here 01 displayNumber pic 9(9).99. 01 computeNumber pic 9(9)V99. 01 alphaNumberic pic a(23). 01 binaryStorage pic x(12). *> Also groups and redefines - a few examples 01 arecord. 03 aSubRecord pic x(10). 03 aUnion pic 9(10) redefines aSubrecord. |
常量 | ||
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 |
const int MAX_STUDENTS = 25; // Can set to a const or var; may be initialized in a constructor readonly float MIN_DIAMETER = 4.93f; |
78 MAX_STUDENTS value 25. *> optionally public, binary-long... *> Currently no direct COBOL equivalent of 'readonly' |
枚举 | ||
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 |
*> enum Action... enum-id. Action. 78 #Start. *> Start is a reserved word 78 #Stop. 78 #Rewind. 78 #Forward. end enum Action. *>enum Status... enum-id. Stat as "Status". 78 Flunk value 50. 78 Pass value 70. 78 Excel value 90. end enum Action. display type "Status"::"Pass" as binary-long *> prints 70 display type "Status"::"Pass" *> prints Pass参见演示程序 |
运算符 | ||
Comparison = < > <= >= <> Arithmetic + - * / Mod \ (integer division) ^ (raise to a power) Assignment = += -= *= /= \= ^= <<= >>= &= Bitwise And Or Xor Not << >> Logical AndAlso OrElse And Or Xor Not 'Note: AndAlso and OrElse perform short-circuit logical evaluations String Concatenation & |
Comparison == < > <= >= != Arithmetic + - * / % (mod) / (integer division if both operands are ints) Math.Pow(x, y) Assignment = += -= *= /= %= &= |= ^= <<= >>= ++ -- Bitwise & | ^ ~ << >> Logical && || & | ^ ! //Note: && and || perform short-circuit logical evaluations String Concatenation + |
Comparison = < > <= >= <> Arithmetic + - * / function mod *>no direct COBOL equivalent to integer division ** Assignment move, set, compute Bitwise b-and, b-or, b-xor, b-not, b-left, b-right Logical and, or, not |
选项 | ||
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 : to put two commands on same line If x <> 100 And y < 5 Then x *= 5 : y *= 2 ' Preferred If x <> 100 And y < 5 Then x *= 5 y *= 2 End If ' To break up any long single line use _ If whenYouHaveAReally < longLine And _ itNeedsToBeBrokenInto2 > Lines Then _ UseTheUnderscore(charToBreakItUp) If x > 5 Then x *= y ElseIf x = 5 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" g += 1 Case Else other += 1 End Select |
greeting = age < 20 ? "What's up?" : "Hello"; // Good practice is that all consequents are enclosed in {} // or are on the same line as if. 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) { 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 } |
*>greeting = age < 20 ? has no directly equivalent syntax in COBOL if age < 20 move "What's up?" to greeting else move "Hello" to greeting end-if if x not = 100 and y < 5 multiply 5 by x multiply 2 by y end-if *>No need for _ or : since statement is terminated by end-if *> evalute is prefered in COBOL rather than if/else if/else evaluate x when > 5 multiply y by x when 5 add y to x when < 10 subtract y from x when other divide y into x end-evaluate evaluate color *> can be any type when "pink" when "red" add 1 to r when "blue" add 1 to b when "green" add 1 to g when other add 1 to other-color end-evaluate参见演示程序 |
循环 | ||
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 looping Dim names As String() = {"Fred", "Sue", "Barney"} For Each s As String In names Console.WriteLine(s) Next Breaking out of loops Dim i As Integer = 0 While (True) If (i = 5) Then Exit While End If i += 1 End While Continue to next iteration For i = 0 To 4 If i < 4 Then Continue For End If Console.WriteLine(i) ' Only prints 4 Next |
Pre-test Loops: // no "until" keyword while (c < 10) { c++; } for (c = 2; c <= 10; c += 2) { Console.WriteLine(c); } Post-test Loop: do { c++; } while (c < 10); Array or collection looping string[] names = {"Fred", "Sue", "Barney"}; foreach (string s in names) { Console.WriteLine(s); } 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 } |
Pre-test loops: *> No WHILE keyword perform until c >= 10 add 1 to c end-perform perform varying c from 2 by 2 until c > 10 display c end-perform Post-test loops: perform with test after until c >= 10 add 1 to c end-perform Array or collection looping 01 names string occurs any. 01 s string. set content of names to ("Fred" "Sue" "Barney") perform varying s through names display s end-perform Breaking out of loops: 01 i binary-long value 0. perform until exit if i = 5 exit perform end-if add 1 to i end-perform Continue to next iteration: 01 i binary-long value 0 perform varying i from 0 by 1 until i >= 5 if i < 4 exit perform cycle end-if display i *>Only prints 4 end-perform参见演示程序 |
数组 | ||
Dim nums() As Integer = {1, 2, 3} For i As Integer = 0 To nums.Length - 1 Console.WriteLine(nums(i)) Next ' 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 ' Resize the array, keeping the existing values (Preserve is optional) ' Note however, that this produces a new copy of the array - it is not an in-place resize! 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 |
int[] nums = {1, 2, 3}; for (int i = 0; i < nums.Length; i++) { Console.WriteLine(nums[i]); } // 5 is the size of the array string[] 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; |
01 nums binary-long occurs any values 1, 2, 3. *> Can also do: set content of nums to (1 2 3) *> 5 is the size of the array 01 names string occurs 5. *> Can also do: 01 names string occurs any. set size of names to 5 set names(1) to "David" *> first element indexed as 1 set names(6) to "Bobby" *> throws System.IndexOutOfRangeException *> COBOL cannot resize an array - use copy 01 names2 string occurs 7. invoke type "Array"::"Copy"(names, names2, names::"Length") *> or else: invoke names::"CopyTo"(names2, 0) 01 twoD float-short occurs any, any. set size of twoD to rows, cols 01 jagged binary-long occurs any, occurs any. set size of jagged to 3 set size of jagged(1) to 5 set jagged(1 5) to 5参见演示程序 |
函数 | ||
' 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) ' 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("Madonna") |
// 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 initializing TestFunc(a, ref b, out c); Console.WriteLine("{0} {1} {2}", a, b, c); // 1 2 5 // 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, ""); } |
method-id. TestFunc. procedure division using by value x as binary-long, by reference y as binary-long, output z as binary-long. add 1 to x, y move 5 to z end method TestFunc. 01 a binary-long value 1. 01 b binary-long value 1. 01 c binary-long. *> c doesn't need initializing invoke self::"TestFunc"(value a reference b output c) *> Or invoke self::"TestFunc"(a b c) display a space b space c *> sum is an intrinsic function in COBOL 01 total binary-long. set total to function sum(4 3 2 1) *> returns 10 *> To create a non intrinsic variable argument list function: Method-id. MySum. 01 i binary-long. Procedure division using params nums as binary-long occurs any returning mysum as binary-long. Perform varying i through nums Add i to mysum End-perform Goback End method MySum. *> then to call it: method-id. main. 01 i binary-long. set i to self::"MySum"(1 2 3 4) display i end method main. *> COBOL doesn't support optional arguments/parameters. *> Just create two different versions of the same function. method-id. SayHello. procedure division using by value nam as string, prefix as string. display "Greetings, " prefix space nam end method SayHello. method-id. SayHello. procedure division using by value nam as string. invoke self::"SayHello"(nam "") end method SayHello.查看演示程序 A 查看演示程序 B |
字符串 | ||
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" & vbTab school = school & "University" ' school is "Harding (tab) University" ' Chars Dim letter As Char = school.Chars(0) ' letter is H 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 comparison Dim mascot As String = "Bisons" If (mascot = "Bisons") Then ' true If (mascot.Equals("Bisons")) Then ' true If (mascot.ToUpper().Equals("BISONS")) Then ' true If (mascot.CompareTo("Bisons") = 0) Then ' true ' String matching with Like - Regex is more powerful If ("John 3:16" Like "Jo[Hh]? #:*") Then 'true ' Substring s = mascot.Substring(2, 3)) ' s is "son" ' Replacement s = mascot.Replace("sons", "nomial")) ' s is "Binomial" ' Split Dim names As String = "Frank,Becky,Ethan,Braden" Dim parts() As String = names.Split(",".ToCharArray()) ' One name in each slot ' Date to string Dim dt As New DateTime(1973, 10, 12) Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy") ' Oct 12, 1973 ' Integer to String Dim x As Integer = 2 Dim y As String = x.ToString() ' y is "2" ' String to Integer Dim 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" |
Escape sequences \r // carriage-return \n // line-feed \t // tab \\ // backslash \" // quote // String concatenation string school = "Harding\t"; school = school + "University"; // school is "Harding (tab) University" // Chars char letter = school[0]; // letter is H 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 comparison string mascot = "Bisons"; if (mascot == "Bisons") // true if (mascot.Equals("Bisons")) // true if (mascot.ToUpper().Equals("BISONS")) // true if (mascot.CompareTo("Bisons") == 0) // true // String matching - No Like equivalent, use Regex // Substring s = mascot.Substring(2, 3)) // s is "son" // Replacement s = mascot.Replace("sons", "nomial")) // s is "Binomial" // Split string names = "Frank,Becky,Ethan,Braden"; string[] parts = names.Split(",".ToCharArray()); // One name in each slot // Date to string DateTime dt = new DateTime(1973, 10, 12); string s = dt.ToString("MMM dd, yyyy"); // Oct 12, 1973 // int to string int x = 2; string y = x.ToString(); // y is "2" // string to int int 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" |
Escape sequences x"0a" *> line-feed x"09" *> tab "\" *> backslash "" *> quote *> string concatenation 01 school string value "Harding" & x"09". set school to string::"Concat"(school, "University") *> school is "Harding (tab) University" *> Chars 01 letter character. 01 word character occurs any. set letter to school::"Chars"(0) *> letter is H set letter to type "Convert"::"ToChar"(65) *> letter is A set letter to 65 as character *> same thing set word to school::"ToCharArray" *>word holds Harding *> String literal 01 msg string value "File is c:\temp\x.dat". *>String comparison 01 mascot string value "Bisons". if mascot = "Bisons" *> true if mascot::"Equals"("Bisons") *> true if mascot::"ToUpper"::"Equals"("BISONS") *> true if mascot::"CompareTo"("Bisons") = 0 *> true *> String matching - no Like equivalent , use Regex *> Substring set s to mascot::"Substring"(2 3) *> s is "son" *> Replacement set s to mascot::"Replace"("sons" "nomial") *> s is "Binomial" *> Split 01 names string value "Frank,Becky,Ethan,Braden". 01 parts string occurs any. set parts to names::"Split"(",") *> Date to string 01 dt type "DateTime" value new "DateTime"(1973, 10, 12). 01 s string. set s to dt::"ToString"("MMM dd, yyyy") *> Oct 12, 1973 *> int to string 01 x string. 01 y binary-long value 2. set x to type x::"ToString" *> x is "2" *> string to int 01 x binary-long. set x to type "Convert"::"ToInt32"("-5") *> x is -5 *> Mutable string 01 buffer type "System.Text.StringBuilder" value new "System.Text.StringBuilder"("two "). invoke buffer::"Append"("three ") invoke buffer::"Insert"(0, "one ") invoke buffer::"Replace("two" "TWO" display buffer *> Prints "one TWO three"参见演示程序 |
异常处理 | ||
' Throw an exception Dim ex As New Exception("Something is really wrong.") Throw ex ' 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) |
// Throw an exception Exception up = new Exception("Something is really wrong."); throw up; // ha ha // Catch an exception try { y = 0; x = 10 / y; } catch (Exception ex) // Argument is optional, no "When" keyword { Console.WriteLine(ex.Message); } finally { Microsoft.VisualBasic.Interaction.Beep(); } |
*> Throw an exception 01 up type "Exception" value new "Exception"("Something is really wrong."); raise up *> ha ha *> Catch an exception try set y to 0; compute x = 10 / y catch (type "Exception" ex) *> Argument is optional, no "When" keyword display ex.Message finally invoke type "Microsoft.VisualBasic.Interaction"::"Beep" end-try参见演示程序 |
命名空间 | ||
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; |
*> At the file level $set ilnamespace "Harding.Compsci.Graphics" *> The directive can also be set as a project *> level to apply the name space to all classes in the project. |
类 / 接口 | ||
' Accessibility keywords Public Private Friend Protected Protected Friend Shared ' Inheritance Class FootballGame Inherits Competition ... End Class ' Interface definition Interface IAlarmClock ... End Interface ' Extending an interface Interface IAlarmClock Inherits IClock ... End Interface ' Interface implementation Class WristWatch Implements IAlarmClock, ITimer ... End Class |
//Accessibility keywords public private internal protected protected internal static // Inheritance class FootballGame : Competition { ... } // Interface definition interface IAlarmClock { ... } // Extending an interface interface IAlarmClock : IClock { ... } // Interface implementation class WristWatch : IAlarmClock, ITimer { ... } |
*> Accessibility keywords public private internal protected protected internal static *> Inheritance class-id. FootballGame inherits type "Competition". ... end class FootballGame. *> Interface definition interface-id. IAlarmClock. ... end interface IAlarmClock. *> Extending an interface interface-id IAlarmClock extends type "IClock". ... end interface IAlarmClock. *> Interface implementation class-id. WristWatch implements type "IAlarmClock", type "ITimer". ... end class WristWatch.参见演示程序 |
构造函数 / 析构函数 | ||
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 Protected Overrides Sub Finalize() ' Desctructor code to free unmanaged resources MyBase.Finalize() End Sub End Class |
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 } } |
class-id. SuperHero. 01 _powerLevel binary-long. method-id. new. procedure division. set _powerLevel to 0 end method new. method-id. new. procedure division using by value powerLevel as binary-long. set _powerLevel to powerLevel end method new. method-id. Finalize override protected. *> Destructor code to free unmanaged resources. end method Finalize. end class SuperHero.参见演示程序 |
使用对象 | ||
Dim hero As SuperHero = New SuperHero ' or Dim hero As New SuperHero 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 ' 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 Dim obj As Object = New SuperHero If TypeOf obj Is SuperHero Then _ Console.WriteLine("Is a SuperHero object.") ' Mark object for quick disposal Using 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 While End Using |
SuperHero hero = new SuperHero(); // No "With" construct hero.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(); Object obj = new SuperHero(); if (obj is SuperHero) { Console.WriteLine("Is a SuperHero object."); } // Mark object for quick disposal using (StreamReader reader = File.OpenText("test.txt")) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } |
01 hero type "SuperHero" value new "SuperHero". 01 hero2 type "SuperHero". 01 obj object. 01 reader type "StreamReader". 01 lin string. // No "With" construct set hero::"Name" to "SpamMan" set hero::"PowerLevel" to 3 invoke hero::"Defend"("Laura Jones") invoke type "SuperHero"::"Rest" *> Calling static method set hero2 to hero *> Both reference the same objectv set hero2::"Name" to "WormWoman" display hero::"Name" *> Prints WormWoman set hero to null *> Free the object if hero = null set hero to new "SuperHero" end-if set obj to new "SuperHero" if obj is instance of type "SuperHero" display "Is a SuperHero object." end-if *> No 'using' construct in COBOL try set reader to type "File"::"OpenText"("test.txt") perform until exit set lin to reader::"ReadLine" if lin = null exit perform end-if end-perform finally if reader not = null invoke reader::"Dispose" end-if end-try参见演示程序 |
结构体 | ||
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 Bob Console.WriteLine(stu2.name); // Prints Sue |
$set sourceformat(free) preservecase valuetype-id. StudentRecord. object. 01 #name string public. 01 gpa float-short public. method-id. new. procedure division using by value nam as string, gpa as float-short. set #name to nam set self::"gpa" to gpa end method new. end object. end valuetype StudentRecord. class-id. a. static. method-id. main. 01 stu type "StudentRecord" value new "StudentRecord"("Bob", 3.5). 01 stu2 type "StudentRecord". procedure division. set stu2 to stu set stu2::"name" to "Sue" display stu::"name" *> Prints Bob display stu2::"name" *> Prints Sue end method main. end static. end class a.参见演示程序 |
属性 | ||
Private _size As Integer 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 foo.Size += 1 |
private int _size; public int Size { get { return _size; } set { if (value < 0) { _size = 0; } else { _size = value; } } } foo.Size++; |
$set sourceformat(free) preservecase class-id. MyClass. object. 01 _size binary-long private. method-id. get property #Size. procedure division returning ret as binary-long. set ret to _size end method. method-id. set property #Size. procedure division using by value val as binary-long. if val < 0 set _size to 0 else set _size to val end-if end method. end object. end class MyClass. class-id. a. static. method-id. main. 01 foo type "MyClass" value new"MyClass". add 1 to foo::"Size" display foo::"Size" end method main. end static. end class a.参见演示程序 |
委托 / 事件 | ||
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) 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.Windows.Forms Dim WithEvents MyButton As Button ' WithEvents can't be used on local variable MyButton = New Button 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 |
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 null MsgArrivedEvent -= new MsgArrivedEventHandler(My_MsgArrivedEventCallback); using System.Windows.Forms; Button MyButton = new Button(); MyButton.Click += new System.EventHandler(MyButton_Click); private void MyButton_Click(object sender, System.EventArgs e) { MessageBox.Show(this, "Button was clicked", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); } |
$set sourceformat(free) preservecase $set ilusing"System" delegate-id. MsgArrivedEventHandler. procedure division using by value messag as string. end delegate MsgArrivedEventHandler. class-id. a. static. 01 MsgArrivedEvent type "MsgArrivedEventHandler" event. *> Delegates must be used with events in COBOL method-id. main. set MsgArrivedEvent to type "Delegate"::"Combine" ( MsgArrivedEvent, new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback") ) as type "MsgArrivedEventHandler" invoke MsgArrivedEvent::"Invoke"("Test message") *> Throws exception if obj is null set MsgArrivedEvent to type "Delegate"::"Remove" ( MsgArrivedEvent, new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback") ) as type "MsgArrivedEventHandler" invoke self::"add_MsgArrivedEvent" (new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback")) invoke MsgArrivedEvent::"Invoke"("Test message 2") end method main. method-id. My_MsgArrivedEventCallback. procedure division using by value str as string. display str end method My_MsgArrivedEventCallback. end static. end class a.参见演示程序 |
Enumb.cbl
$set sourceformat(free) preservecase enum-id. Action. 78 #Start. *> Start is a reserved word 78 #Stop. 78 #Rewind. 78 #Forward. end enum Action. enum-id. Stat as "Status". 78 Flunk value 50. 78 Pass value 70. 78 Excel value 90. end enum Stat. program-id. main. display type "Status"::"Pass" as binary-long *> prints 70 display type "Status"::"Pass" *> prints Pass end program main.返回表格
Choices.cbl
$set sourceformat(free) program-id. a. 01 age binary-long. 01 greeting string. 01 x binary-long. 01 y binary-long. 01 color string value "blue". 01 r binary-long value 0. 01 b binary-long value 0. 01 g binary-long value 0. 01 other-color binary-long value 0. if age < 20 move "What's up?" to greeting else move "Hello" to greeting end-if if x not = 100 and y < 5 multiply 5 by x multiply 2 by y end-if evaluate x when > 5 multiply y by x when 5 add y to x when < 10 subtract y from x when other divide y into x end-evaluate evaluate color *> can be any type when "pink" when "red" add 1 to r when "blue" add 1 to b when "green" add 1 to g when other add 1 to other-color end-evaluate返回表格
Loops.cbl
$set sourceformat(free) 01 c binary-long value 0. 01 names string occurs any. 01 s string. 01 i binary-long value 0. *>Pre-test loops: perform until c >= 10 *> No WHILE keyword add 1 to c end-perform perform varying c from 2 by 2 until c > 10 display c end-perform *> Post-test loops: perform with test after until c >= 10 add 1 to c end-perform *>Array or collection looping set content of names to ("Fred" "Sue" "Barney") perform varying s through names display s end-perform *>Breaking out of loops: perform until false if i = 5 exit perform end-if display i add 1 to i end-perform *>Continue to next iteration: perform varying i from 0 by 1 until i >= 5 if i < 4 exit perform cycle end-if display i end-perform返回表格
Arrays.cbl
$set sourceformat(free) $set ilusing"System" 01 nums binary-long occurs any values 1, 2, 3. 01 names string occurs 5. *> 5 is the size of the array *> Can also do: *>01 names string occurs any. 01 names2 string occurs 7. 01 twoD float-short occurs any, any. 01 jagged binary-long occurs any, occurs any. 01 rows binary-long value 3. 01 cols binary-long value 10. set content of nums to (1 2 3 4) *> Resets the contents of the array (optionally chaning the size set size of names to 5 *> Create an array lf length 5 set names(1) to "David" *> first element indexed as 1 *>set names(6) to "Bobby" *> throws System.IndexOutOfRangeException *> COBOL cannot directly resize an array - use copy invoke type "Array"::"Copy"(names, names2, names::"Length") *> or else: invoke names::"CopyTo"(names2, 0) set size of twoD to rows, cols set size of jagged to 3 set size of jagged(1) to 5 set jagged(1 5) to 5返回表格
Functions-a.cbl
$set sourceformat(free) preservecase class-id. a. static. method-id. main. 01 a binary-long value 1. 01 b binary-long value 1. 01 c binary-long. *> c doesn't need initializing 01 total binary-long. invoke self::"TestFunc"(a b c) *> or invoke self::"TestFunc"(value a reference b output c) display a space b space c set total to function sum(4 3 2 1) *> returns 10 invoke self::"SayHello"("Robert" "Mr.") invoke self::"SayHello"("Robert") end method main. method-id. TestFunc. procedure division using by value x as binary-long, by reference y as binary-long, output z as binary-long. add 1 to x, y move 5 to z end method TestFunc. *> COBOL doesn't support optional arguments/parameters. *> Just create two different versions of the same function. method-id. SayHello. procedure division using by value nam as string, prefix as string. display "Greetings, " prefix space nam end method SayHello. method-id. SayHello. procedure division using by value nam as string. invoke self::"SayHello"(nam "") end method SayHello. end static. end class a.返回表格
Functions-b.cbl
$set sourceformat(free) preservecase class-id. a. static. method-id. main. 01 i binary-long. set i to self::"MySum"(1 2 3 4) display i end method main. Method-id. MySum. 01 i binary-long. Procedure division using params nums as binary-long occurs any returning mysum as binary-long. Perform varying i through nums Add i to mysum End-perform Goback End method MySum. end static. end class a.返回表格
Strings.cbl
$set sourceformat(free) $set ilusing"System" *> x"0d" *> carriage-return *> x"0a" *> line-feed *> x"09" *> tab *> "\" *> backslash *> "" *> quote *> Chars 01 letter character. 01 word character occurs any. 01 school string value "Harding" & x"09". *> String literal 01 msg string value "File is c:\temp\x.dat". 01 mascot string value "Bisons". 01 names string value "Frank,Becky,Ethan,Braden". 01 parts string occurs any. 01 dt type "DateTime" value new "DateTime"(1973, 10, 12). 01 s string. 01 x binary-long. 01 buffer type "System.Text.StringBuilder" value new "System.Text.StringBuilder"("two "). *> string concatenation set school to string::"Concat"(school, "University") *> school is "Harding (tab) University" set letter to school::"Chars"(0) *> letter is H set letter to type "Convert"::"ToChar"(65) *> letter is A set letter to 65 as character *> same thing set word to school::"ToCharArray" *>word holds Harding *>String comparison if mascot = "Bisons" *> true display "Pass" end-if if mascot::"Equals"("Bisons") *> true display "Pass" end-if if mascot::"ToUpper"::"Equals"("BISONS") *> true display "Pass" end-if if mascot::"CompareTo"("Bisons") = 0 *> true display "Pass" end-if *> String matching - no Like equivalent , use Regex *> Substring set s to mascot::"Substring"(2 3) *> s is "son" *> Replacement set s to mascot::"Replace"("sons" "nomial") *> s is "Binomial" display s *> Split set parts to names::"Split"(",") *> Date to string set s to dt::"ToString"("MMM dd, yyyy") *> Oct 12, 1973 display s *> string to int set x to type "Convert"::"ToInt32"("-5") *> x is -5 *> Mutable string invoke buffer::"Append"("three ") invoke buffer::"Insert"(0, "one ") invoke buffer::"Replace"("two" "TWO") display buffer *> Prints "one TWO three"返回表格
Exceptions.cbl
$set sourceformat(free) $set ilusing "System" $set ilref"Microsoft.VisualBasic.dll" *> Throw an exception 01 exc type "Exception"value new "Exception"("Something is really wrong."). 01 x binary-long. 01 y binary-long. *> Catch an exception try set y to 0; divide y into x catch exc *> Argument is optional, no "When" keyword display exc::"Message" finally invoke type "Microsoft.VisualBasic.Interaction"::"Beep" end-try raise exc *> ha ha返回表格
ClassesInterfaces.cbl
$set sourceformat(free) preservecase *> Inheritance class-id. FootballGame inherits type "Competition". end class FootballGame. *> Interface definition *>interface-id. IAlarmClock. *>end interface IAlarmClock. *> Extending an interface interface-id. IAlarmClock inherits type "IClock". end interface IAlarmClock. *> Interface implementation class-id. WristWatch implements type "IAlarmClock", type "ITimer". end class WristWatch. interface-id. IClock. end interface IClock. interface-id. ITimer. end interface ITimer. class-id. Competition. end class Competition.返回表格
ConstructorsDestructors.cbl
$set sourceformat(free) preservecase class-id. SuperHero. 01 _powerLevel binary-long. method-id. new. procedure division. set _powerLevel to 0 end method new. method-id. new. procedure division using by value powerLevel as binary-long. set _powerLevel to powerLevel end method new. method-id. Finalize override protected. *> Destructor code to free unmanaged resources. *> Implicitly creates a Finalize method end method Finalize. end class SuperHero.返回表格
UsingObjects.cbl
$set sourceformat(free) preservecase $set ilusing"System.IO" program-id. main. 01 hero type "SuperHero" value new "SuperHero". 01 hero2 type "SuperHero". 01 obj object. 01 reader type "StreamReader". 01 lin string. // No "With" construct set hero::"Name" to "SpamMan" set hero::"PowerLevel" to 3 invoke hero::"Defend"("Laura Jones") invoke type "SuperHero"::"Rest" *> Calling static method set hero2 to hero *> Both reference the same object set hero2::"Name" to "WormWoman" display hero::"Name" *> Prints WormWoman set hero to null *> Free the object if hero = null set hero to new "SuperHero" end-if set obj to new "SuperHero" if obj is instance of type "SuperHero" display "Is a SuperHero object." end-if *> No 'using' construct in COBOL try set reader to type "File"::"OpenText"("test.txt") perform until exit set lin to reader::"ReadLine" if lin = null exit perform end-if end-perform finally if reader not = null invoke reader::"Dispose" end-if end-try end program main. class-id. SuperHero. static. method-id. Rest. end method Rest. end static. object. 01 #Name string property. 01 PowerLevel binary-long property. method-id. Defend. procedure division using by value attacker as string. end method Defend. end object. end class SuperHero.返回表格
Structs.cbl
$set sourceformat(free) preservecase valuetype-id. StudentRecord. object. 01 #name string public. 01 gpa float-short public. method-id. new. procedure division using by value nam as string, gpa as float-short. set #name to nam set self::"gpa" to gpa end method new. end object. end valuetype StudentRecord. class-id. a. static. method-id. main. 01 stu type "StudentRecord" value new "StudentRecord"("Bob", 3.5). 01 stu2 type "StudentRecord". procedure division. set stu2 to stu set stu2::"name" to "Sue" display stu::"name" *> Prints Bob display stu2::"name" *> Prints Sue end method main. end static. end class a.返回表格
Properties.cbl
$set sourceformat(free) preservecase class-id. MyClass. object. 01 _size binary-long private. method-id. get property #Size. procedure division returning ret as binary-long. set ret to _size end method. method-id. set property #Size. procedure division using by value val as binary-long. if val < 0 set _size to 0 else set _size to val end-if end method. end object. end class MyClass. class-id. a. static. method-id. main. 01 foo type "MyClass" value new"MyClass". add 1 to foo::"Size" display foo::"Size" end method main. end static. end class a.返回表格
DelegatesEvents.cbl
$set sourceformat(free) preservecase $set ilusing"System" delegate-id. MsgArrivedEventHandler. procedure division using by value messag as string. end delegate MsgArrivedEventHandler. class-id. a. static. 01 MsgArrivedEvent type "MsgArrivedEventHandler" event. *> Delegates must be used with events in C# method-id. main. set MsgArrivedEvent to type "Delegate"::"Combine"(MsgArrivedEvent, new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback")) as type "MsgArrivedEventHandler" invoke MsgArrivedEvent::"Invoke"("Test message") *> Throws exception if obj is null set MsgArrivedEvent to type "Delegate"::"Remove"(MsgArrivedEvent, new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback")) as type "MsgArrivedEventHandler" invoke self::"add_MsgArrivedEvent"(new "MsgArrivedEventHandler"(self::"My_MsgArrivedEventCallback")) invoke MsgArrivedEvent::"Invoke"("Test message 2") *> Throws exception if obj is null end method main. method-id. My_MsgArrivedEventCallback. procedure division using by value str as string. display str end method My_MsgArrivedEventCallback. end static. end class a.返回表格
本文档大量引用以下内容(感谢):由 Harding 大学计算机科学系 Frank McCown 博士编写 Robert Sales(Micro Focus International)创建了额外的 COBOL 信息,Alex Turner(Micro Focus International)进行了合并和重新格式化。本作品采用 知识共享 许可。