Monday, August 16, 2004

 

Some notes on comparison between C#, C++ and VB.Net

1.
作者:doggy
出处:http://www.smth.org/pc/pccon.php?id=860&nid=19768&s=all

(按:从filer那里知道了引用的用法,实验一下)

[quote]
C#中修饰符又增加了几个。这里希望给出一个尽量清晰的作用表。

类 成员
常量
成员
变量 方法
属性
property
索引器 构造
/析构 参数表
const must
static1 yes yes10 yes yes
abstract2 yes yes10
sealed3 yes yes11
extern4 yes
new5 yes yes yes yes yes
readonly6 yes
volatile yes
virtual yes yes yes
override yes yes yes
unsafe yes yes yes
ref7 yes
out8 yes
params9 yes


静态的函数中只能使用静态成员变量。
抽象类不能实例化。必须是public的,不能和sealed同时使用。
sealed表示不可派生类和不可override函数。
外部unmanaged代码实现。
new可用来保留基类的成员,不能与override同时使用。用base引用。
readonly与const的区别是,readonly是实例的,而const是类的(静态)。
引用参数在调用时是要查看地址的。所以不能把没有内容的对象做ref参数的实参。
out可以没有实例。
类似于C语言的arg_list。
不能有virtual、abstract和override。
总是与override搭配使用。
接口和接口中的方法都只能用访问修饰字。
public、private、protected和internal是访问修饰字。可以修饰上表中除了参数之外的各列。可以联合使用internal protected。
[/quote]

[quote]
基本类型
char sbyte byte short ushort int uint decimal long ulong bool float double void string object signed unsigned
用户类型
enum struct class namespace interface delegate union
常数
null false true
流程结构
if else do while for foreach in switch case default
return goto break continue
修饰字
static const new* sealed abstract virtual override extern* event
访问修饰字protected private public internal
变量专有fixed readonly volatile
参数专有ref out params
内存分配
new stackalloc delete
异常处理
try catch throw finally
类指针
base this
运算符
as is sizeof typeof
安全
unsafe checked unchecked
运算符重载
operator
包含命名空间
using
线程锁
lock
隐式显式转换
implicit explicit
这三个MSDN中说不算保留字,我觉得是
set get value
template typedef register inline friend auto

* 含义与原来不同

从上面关键字表中可以看到,C#对C++的修改主要在:

多样化的类型:去掉了原来的signed和unsigned,把各种长度的有无符号整数类型分别用了不同关键字。另外增加了string类型(作为一门高级语言,怎么能没有内建的string?)。(按:这方面讨论很多了,不赘述)
更严格的修饰字:对类派生而重写成员函数,给出了几个严格的修饰字。另外对参数也有了专用的修饰字。
更加重视代码安全:使用unsafe,cheched和unchecked,把安全与不安全代码严格分开。
去掉了模板。
其它的变化还有:

增加了命名空间(namespace),接口(interface)和委托(delegate)。
foreach循环。
可选择定义显式或隐式的类型转换运算符(implicit和explicit)。
不用include头文件了,取而代之的是using语句。
base明确使用基类成员。
as、in、is、typeof运算符:让程序员有更加清晰的类型的概念,不像C++那样含糊。
finally语句。
从以上的分析可以看出,C#语言对C++语言的改善,主要是增加了程序的清晰性,排除了出现歧义的可能。
[/quote]

2.
VB.NET and C# 语法比较手册
Translated By ghj1976
From http://dev.csdn.net/article/4/article/25/25324.shtm
http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html

VB.NET
C#
Comments
' Single line only
Rem Single line only
// Single line
/* Multiple
line */
/// XML comments on single line
/** XML comments on multiple lines */
Data Types
Value Types
Boolean
Byte
Char (example: "A"c)
Short, Integer, Long
Single, Double
Decimal
Date
Reference Types
Object
String

Dim x As Integer
Console.WriteLine(x.GetType()) ' Prints System.Int32
Console.WriteLine(TypeName(x)) ' Prints Integer
' Type conversion
Dim numDecimal As Single = 3.5
Dim numInt As Integer
numInt = CType(numDecimal, Integer) ' set to 4 (Banker's rounding)
numInt = CInt(numDecimal) ' same result as CType
numInt = Int(numDecimal) ' set to 3 (Int function truncates 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 As Integer = 25
const int MAX_STUDENTS = 25;
Enumerations
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) ' Prints 1

Console.WriteLine(Status.Pass)  ' Prints 70

Dim s As Type = GetType(Status)
Console.WriteLine([Enum].GetName(s, Status.Pass)) ' 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(Status.Pass); // Prints Pass
Operators
Comparison
= < > <= >= <>
Arithmetic
+ - * /
Mod
\ (integer division)
^ (raise to a power)
Assignment
= += -= *= /= \=  ^= <<=  >>= &=
Bitwise
And  AndAlso Or  OrElse Not << >>
Logical
And AndAlso Or  OrElse  Not
Note: AndAlso and OrElse are for short-circuiting 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
+
Choices
greeting = IIf(age < 20, "What's up?", "Hello")
' One line doesn't require "End If", no "Else"
If language = "VB.NET" Then langType = "verbose"
' Use : to put two commands on same line
If x <> 100 Then x *= 5 : y *= 2  
' or to break up any long single command 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";
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
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
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
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)
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# 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)
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, "");
}
Exception Handling
' Deprecated unstructured error handling
On Error GoTo MyErrorHandler
...
MyErrorHandler: Console.WriteLine(Err.Description)

Dim ex As New Exception("Something is really wrong.")
Throw  ex
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





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
Namespace Harding.Compsci.Graphics 
...
End Namespace
' or
Namespace Harding
Namespace Compsci
Namespace Graphics 
...
End Namespace
End Namespace
End Namespace
Import Harding.Compsci.Graphics
namespace Harding.Compsci.Graphics {
...
}
// or
namespace Harding {
namespace Compsci {
namespace Graphics {
...
}
}
}
using Harding.Compsci.Graphics;
Classes / Interfaces
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 {
...
}
Constructors / Destructors
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
}
}
Objects
Dim hero As SuperHero = 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 refer to 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.")
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
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
Properties
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++;
Delegates / Events
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);
}
Console I/O
Special character constants
vbCrLf, vbCr, vbLf, vbNewLine
vbNullString
vbTab
vbBack
vbFormFeed
vbVerticalTab
""
Chr(65) ' Returns 'A'
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() ' Read single char
Console.WriteLine(c) ' Prints 65 if user enters "A"
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
Imports System.IO
Dim writer As StreamWriter = File.CreateText("c:\myfile.txt")
writer.WriteLine("Out to file.")
writer.Close()
Dim reader As StreamReader = File.OpenText("c:\myfile.txt")
Dim line As String = reader.ReadLine()
While Not line Is Nothing
Console.WriteLine("line=" & line)
line = reader.ReadLine()
End While
reader.Close()
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()
Dim binReader As New BinaryReader (File.OpenRead("c:\myfile.dat"))
str = binReader.ReadString()
num = binReader.ReadInt32()
binReader.Close()
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();

3.
Complete Comparison for VB.NET and C#
By Amalorpavanathan Yagulasamy(AMAL)

This article explains about advantages, differences and new features of VB.NET and C#.
http://www.codeproject.com/useritems/vbnet_c__difference.asp



<< Home

This page is powered by Blogger. Isn't yours?