DELPHI7与C#语法比较

DELPHI and C# Comparison

DELPHI7与C#语法比较
编制:黄焕尧      参考:VB.net and C# Comparison     日期:2005-5-30.

 

Comments 注释
Data Types数据类
Constants 常量
Enumerations 枚举
Operators 运算

Choices 选择语句
Loops 循环语句
Arrays 数组
Functions 函数
Exception Handling 异常处理

Namespaces 命名空间
Classes / Interfaces
Constructors / Destructors 构造/释构
Objects 对象
Structs 结构

Properties 属性
Delegates / Events
Console I/O
File I/O

 

DELPHI

C#

Comments注释

// Single line only
{ Multiple

line  }

* Multiple

line  *)

// Single line
/* Multiple
    line  */
/// XML comments on single line
/** XML comments on multiple lines */

Data Types 数据类型

Value Types 简单类型
Boolean
Byte
Char   (example: "A"c)
Word, Integer, Int64
Real ,Single, Double,Real48,Extended,Comp,Currency
Decimal
Tdate,TDateTime

Reference Types
Object
String(ShortString,AnsiString,WideString)

Set, array, record, file,class,class reference,interface
pointer, procedural, variant

var x:Integer;
 WriteLine(x);     // Prints System.Int32
 WriteLine(‘Ingeger’);  // Prints Integer

// Type conversion
var numDecimal:Single = 3.5 ;
var numInt:Integer;
numInt :=Integer(numDecimal)   // set to 4 (Banker's rounding)
 the decimal)

Value Types
bool
byte, sbyte
char   (example: 'A')
short, ushort, int, uint, long, ulong
float, double
decimal
DateTime   (not a built-in C# type)

Reference Types
object
string

 

int x;
Console.WriteLine(x.GetType());    // Prints System.Int32
Console.WriteLine(typeof(int));      // Prints System.Int32


// Type conversion
double numDecimal = 3.5;
int numInt = (int) numDecimal;   // set to 3  (truncates decimal)

Constants常量

Const MAX_STUDENTS:Integer = 25;

const int MAX_STUDENTS = 25;

Enumerations枚举

Type Taction1=(Start, Stop, Rewind, Forward);

{$M+}
Type Status=(Flunk = 50, Pass = 70, Excel = 90);
 {$M-}
var a:Taction1 = Stop;
If a <>Start Then  WriteLn(ord(a));     // Prints 1

 WriteLine(Ord(Pass));     // Prints 70

 WriteLine(GetEnumName(TypeInfo(Status),Ord(Pass)));   // Prints Pass
ShowEnum(Pass); //outputs 70

GetEnumValue(GetEnumName(TypeInfo(Status),’Pass’));//70

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

Operators运算符

Comparison  比较
=  <  >  <=  >=  <>  in  as

Arithmetic 算述述运算
+  -  *  /  div
Mod
(integer division)
(raise to a power) 阶乘

Assignment 赋值分配
:=  Inc()  Dec()   shl  shr 

Bitwise 位运算
and  xor  or    not  shl  shr

//Logical
and  xor  or    not

 

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

Choices 判断

greeting := IfThen (age < 20, ‘What's up?’, ‘Hello’);

 
If language = ‘DELPHI’ Then
  langType := ‘hymnlan’;

//
If x <> 100 Then
begin
  x := x*5 ; y :=x* 2;  
end;

// or to break up any long single command use _
If (whenYouHaveAReally < longLine
 and itNeedsToBeBrokenInto2 > Lines Then
   UseTheUnderscore(charToBreakItUp);

'If x > 5 Then
  x :=x* y
Else If x = 5 Then
  x :=x+ y
Else If x < 10 Then
  x :=x- y
Else
  x :=x/ y ;

Case color of  // 不能为字符串类型
  pink, red:  
    r :=r+ 1;
  blue:
    b :=b+1;
  green:
    g :=g+ 1;
  Else
    Inc(other); 
End;

greeting = age < 20 ? "What's up?" : "Hello";

 

 


if
(x != 100) {    // Multiple statements must be enclosed in {}
  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;



switch (color) {                          // Must be integer or string
  case "pink":
  case "red":    r++;    break;        // break is mandatory; no fall-through
  case "blue":   b++;   break;
  case "green": g++;   break;
  default:    other++;   break;       // break necessary on default
}

Loops 循环

Pre-test Loops:

While c < 10 do
  Inc(c) ;
End

For c = 2 To 10 do
  WriteLn(IntToStr(c));

For c = 10 DownTo 2  do
  WriteLn(IntToStr(c));

 

repeat
  Inc(c);
Until c = 10 ;

//  Array or collection looping
count names:array[] of String = (‘Fred’, ‘Sue’, ‘Barney’)
For i:=low(name) to High(name) do
  WriteLn(name[i]);

DELPHI8开始支持 for … each … 语法

Pre-test Loops:  

// no "until" keyword
while (i < 10)
  i++;

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



Post-test
Loop:

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



// Array or collection looping

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

Arrays 数组

var nums:array[] of Integer = (1, 2, 3) 
For i := 0 To High(nums) do
  WriteLn(IntToStr(nums[i]))


// 4 is the index of the last element, so it holds 5 elements
var names:array[0..5] of String; //用子界指定数组范围
names[0] = "David"
names[5] = "Bobby" 

// Resize the array, keeping the existing values
SetLength(names,6);



var twoD:array[rows-1, cols-1] of Single;
twoD[2, 0] := 4.5;

var jagged:array[] of Integer =((0,0,0,0),(0,0,0,0));  
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# doesn't 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;

Functions函数

' Pass by value(传值参数) (in, default), 传递引用参数reference (in/out), and reference (out) 
procedure TestFunc( x:Integer, var y:Integer, var z:Integer)
;
begin
  x :=x+1;
  y :=y+1;
  z := 5;
End;

count a = 1; 
var b:integer=1; c :Integer=0;   // c set to zero by default 
TestFunc(a, b, c);
  WriteLn(Format(‘%d %d %d’,[a, b, c]);   // 1 2 5

// Accept variable number of arguments
Function Sum(nums:array[] of Integer):Integer;
begin
  Result := 0; 
  For i:=Low(nums) to high(nums) do
    Result := Result + I;
  
End  

var total :Integer;

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

// Optional parameters must be listed last and must have a default value
procedure SayHello( name:String;prefix:String = ‘’);
begin
  WriteLn(Greetings, + prefix + + name);
End;

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, "");
}

Exception Handling 异常处理

' Deprecated unstructured error handling

var ex :TException;
ex:=TException.Create(‘Something is really wrong.’);
 

Try    //DELPHI 不支持异常捕捉与Finally同时使用
Try
 
  y = 0
  x = 10 / y
except
 ON  Ex:Exception 
 begin
  if y = 0  then '
    WriteLn(ex.Message) ;
end;
Finally
  Beep();
End;





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

try
  y = 0;
  x = 10 / y;
}
catch (Exception ex) {   // Argument is optional, no "When" keyword 
  Console.WriteLine(ex.Message);
}
finally {
  // Must use unmanaged MessageBeep API function to beep
}

Namespaces 命名空间

//delphi无命名空间,以单元与之对应

Unit  Harding; 
  ...
End.

 

 

 

uses Harding;

namespace Harding.Compsci.Graphics {
  ...
}

// or

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

using Harding.Compsci.Graphics;

Classes / Interfaces 类和接口

Accessibility keywords 界定关键字
Public
Private
                  
Protected
published

// Protected
Type FootballGame= Class 
   Protected
    Competition:string;
  ...
 End

// Interface definition
Type IalarmClock= Interface (IUnknown) 
   ...
End // end Interface

// Extending an interface 
Type IalarmClock= Interface (IUnknown)
 ['{00000115-0000-0000-C000-000000000044}']
  function Iclock:Integer;
  ...
End //end Interface

// Interface implementation
Type WristWatch=Class(TObject, IAlarmClock ,ITimer) 
 function Iclock:Integer;
   ...
End  

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 {
   ...
}

Constructors / Destructors构造/释构

Type SuperHero=Class
  Private 
    ApowerLevel:Integer;

  Public
    constructor Create;override;
    constructor New(powerLevel:Integer);
virtual;
    destructor Destroy; override;
end; //end Class Interface

Implementation

procedure Create();
begin
  ApowerLevel := 0;
end;
procedure New(powerLevel:Integer);
begin
  self.ApowerLevel := powerLevel;
end;
procedure Destroy;
begin

 

  inherited Destroy;

end
End.

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

Objects 对象

var hero:SuperHero;

 hero := SuperHero.Create;
With hero
  Name := "SpamMan";
  PowerLevel := 3;
End //end With

hero.Defend(‘Laura Jones’);
hero.Rest();     // Calling Shared method
// or
SuperHero.Rest();

var hero2:SuperHero;

hero2:= hero;  // Both refer to same object
hero2.Name := ‘WormWoman’;
 WriteLn(hero.Name)   // Prints WormWoman

hero.Free;
hero = nil;    // Free the object

if hero= nil then 
  hero := SuperHero.Create;

var obj:Object;

 obj:= SuperHero.Create;
if obj is SuperHero then
 WriteLn(‘Is a SuperHero object.’);

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 refer to 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.");

Structs记录/结构

Type

StudentRecord = packed Record
   name:String;
   gpa:Single;
End //end Structure

Var stu:StudentRecord;
stu.name:=’Bob;
stu:=3.5;
var stu2:StudentRecord;
stu2 := stu;  

stu2.name := ‘Sue’;
 WriteLn(stu.name)    // Prints Bob
 WriteLn(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

Properties属性

Private
Asize:Integer;

Published
Property Size:Integer read GetSize write SetSize;

End;

Implementation

Function GetSize:Integer;
begin
  Result:=Asize;
end;
procedure SetSize(Value:Integer);
begin
  if Value<0 then
    Asize := 0
  else
    Asuze := Value;
end;

foo.Size := foo.Size + 1;

private int _size;

public int Size {
  get {
    return _size;
  }
  set {
    if (value < 0)
      _size = 0;
    else
      _size = value;
  }
}


foo.Size++;

Delegates / Events事件

Type
 
MsgArrivedEventHandler=prcedure(message:string) of object;

MsgArrivedEvent:MsgArrivedEventHandler;

 

Type
MyButton =Class(Tbutton)
 private
  FClick:MsgArrivedEventHandler;
 public
  procedure Click;
  property onClick:MsgArrivedEventHandler read Fclick write Fclick;
end;

Implementation

Procedure MyButton.Click;
begin
  MessageBox (self.handle, ‘Button was clicked’, ‘Info’,
    MessageBoxButtonsOK, MessageBoxIconInformation);
end;

 

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);
}

Console I/O

 DELPHI无控制台对象

若为控制台程序则

Write(count Text);

WriteLn(count Text);

Read(var Text);

ReadLn(var Text);

Escape sequences
/n, /r
/t
//
/"

Convert.ToChar(65)  // Returns 'A' - equivalent to Chr(num) in VB
// or
(char) 65

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


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

File I/O

//uses System

Var fwriter: TextFile;

AssignFile (fwriter,’c:/myfile.txt’);
fwriter.WriteLn(‘Out to file.’);
CloseFile(fwriter);

var reader:TextFile; line:String;

AssignFile(reader ,‘c:/myfile.txt’);
Readln(reader ,line);
While Not (line=’’) do
begin
  WriteLn(‘line=’ + line);
  Readln(reader ,line);
End; 
CloseFile(reader);

var str:String = ‘Text data’;
var num :Integer = 123;
var binWriter:
TfileStream;

binWriter:= TFileStream.Create(‘c:/myfile.dat’, fmCreate or fmOpenWrite);
try
  binWriter.Write(str,sizeof(str)); 
  binWriter.Write(num,sizeof(num)); 
finally
  binWriter.Free;
end;

var binReader: TFileStream;

binReader :=TFileStream.Create(‘c:/myfile.dat’, fmOpenRead or mShareDenyRead);
try
  binReader.Read(str,sizeof(str));
  binReader.Read(num,sizeof(num));
finally
  binReader.Free;
end;

using System.IO;

StreamWriter writer = File.CreateText("c://myfile.txt");
writer.WriteLine("Out to file.");
writer.Close();

StreamReader reader = File.OpenText("c://myfile.txt");
string line = reader.ReadLine();
while (line != null) {
  Console.WriteLine(line);
  line = reader.ReadLine();
}
reader.Close();

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

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

 

 

你可能感兴趣的:(.NET)