您的位置:首页 > 编程语言 > VB

VB.NET and C# Comparison

2007-07-11 10:18 477 查看
VB.NETProgram StructureC#
' Single line only

Rem Single line only
// Single line

/* Multiple

line */

/// XML comments on single line

/** XML comments on multiple lines */

VB.NETData TypesC#
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( 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 (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

Console.WriteLine(x. GetType().Name ); // prints Int32

// Type conversion

float d = 3.5f;

int i = (int) d; // set to 3 (truncates decimal)

VB.NETConstantsC#
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;

VB.NETEnumerationsC#
Enum Action

Start

[Stop] ' Stop is a reserved word

Rewind

Forward

End Enum

Enum Status

Flunk = 50

Pass = 70

Excel = 90

End Enum



Dim a As Action = Action.Stop

If a <> Action.Start Then _

Console.WriteLine(a.ToString & " is " & a) ' Prints "Stop is 1"

Console.WriteLine(Status.Pass) ' Prints 70

Console.WriteLine(Status.Pass.ToString()) ' Prints Pass
enum Action {Start, Stop, Rewind, Forward};

enum Status {Flunk = 50, Pass = 70, Excel = 90};

Action a = Action.Stop;

if (a != Action.Start)

Console.WriteLine(a + " is " + (int) a); // Prints "Stop is 1"

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

Console.WriteLine(Status.Pass); // Prints Pass
VB.NETOperatorsC#
Comparison

= < > <= >= <>

Arithmetic

+ - * /

Mod

\ (integer division)

^ (raise to a power)

Assignment

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

Bitwise

And Or 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

+

VB.NETChoicesC#
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";

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

}

VB.NETLoopsC#
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

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

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

}

VB.NETArraysC#
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# can't dynamically resize an array. Just copy into new array.

string[] names2 = new string[7];

Array.Copy(names, names2, names.Length); // or names.CopyTo(names2, 0);

float [,] twoD = new float[rows, cols];

twoD[2,0] = 4.5f;

int [][] jagged = new int[3][] {

new int[5], new int[2], new int[3] };

jagged[0][4] = 5;

VB.NETFunctionsC#
' 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, "");

}

VB.NETStringsC#
Special character constants

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

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

' String matching

If ("John 3:16" Like "Jo[Hh]? #:*") Then 'true

Imports System.Text.RegularExpressions ' More powerful than Like

Dim r As New Regex ("Jo[hH]. \d:*")

If (r.Match("John 3:16").Success) Then 'true

' My birthday: Oct 12, 1973

Dim dt As New DateTime(1973, 10, 12)

Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy")

' 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

\n, \r

\t

\\

\"

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

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

// String matching

// No Like equivalent - use regular expressions

using System.Text.RegularExpressions;

Regex r = new Regex (@"Jo[hH]. \d:*");

if (r.Match("John 3:16").Success) // true

// My birthday: Oct 12, 1973

DateTime dt = new DateTime(1973, 10, 12);

string s = "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"

VB.NETException HandlingC#
' 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 {

// Requires reference to the Microsoft.VisualBasic.dll

// assembly (pre .NET Framework v2.0)

Microsoft.VisualBasic.Interaction.Beep();

}

VB.NETNamespacesC#
Namespace Harding.Compsci.Graphics

...

End Namespace

' or

Namespace Harding

Namespace Compsci

Namespace Graphics

...

End Namespace

End Namespace

End Namespace


Imports Harding.Compsci.Graphics

namespace Harding.Compsci.Graphics {

...

}

// or

namespace Harding {

namespace Compsci {

namespace Graphics {

...

}

}

}

using Harding.Compsci.Graphics;

VB.NETClasses / InterfacesC#
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 {

...

}

VB.NETConstructors / DestructorsC#
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

}

}

VB.NETUsing ObjectsC#
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);

}
VB.NETStructsC#
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

VB.NETPropertiesC#
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++;

VB.NETDelegates / EventsC#
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);

}

VB.NETConsole I/OC#
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"

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"

VB.NETFile I/OC#
Imports System.IO

' 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

Dim reader As StreamReader = File.OpenText("c:\myfile.txt")

Dim line As String = reader.ReadLine()

While Not line Is Nothing

Console.WriteLine(line)

line = reader.ReadLine()

End While

reader.Close()

' Write out to binary 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

Dim binReader As New BinaryReader (File.OpenRead("c:\myfile.dat"))

str = binReader.ReadString()

num = binReader.ReadInt32()

binReader.Close()

using System.IO;

// Write out to text file

StreamWriter writer = 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 = reader.ReadLine();

while (line != null) {

Console.WriteLine(line);

line = reader.ReadLine();

}

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

// Read from binary file

BinaryReader binReader = new BinaryReader(File.OpenRead("c:\\myfile.dat"));

str = binReader.ReadString();

num = binReader.ReadInt32();

binReader.Close

//全局层

VB支持Module,是一种全部成员都是静态的特殊类型

C#支持static class,和VB的Module类似;

VB的Imports语句可以把类的静态成员导入,而C#的using语句没有这个功能

Imports System.Math

VB可以选择变量是否必须声明,以及类型是否必须指定(通过Option语句)

C#则默认是VB最严格的状态

C#可以使用extern alias指定程序集的别名,并使用别名限定运算符::来解析类名冲突的两个程序集

VB没有这个功能,但可以用Global关键字获得命名空间级别名称冲突解析能力

C#可以指定友元程序集,VB不支持

//成员层

VB可以直接重写Object.Finalize方法,而C#必须采用析构函数的语法

C#可以指定attribute的target以便清楚地放置attribute,而VB则通过尖括号的位置来决定,有时候写不出某种C#可行的语法

VB能够重载这些C#不支持的运算符:&, ^, Like, \

C#能够重载这些VB不支持的运算符:++, --, !

VB中子类的构造函数,先调用父类的构造函数,然后才初始化子类的字段

C#中子类的构造函数,先初始化子类的字段,然后才调用父类的构造函数

VB的Implemnts语句可以为实现接口的方法改名,改变访问级别

C#不支持但是有一个显式实现的语法可以帮忙

VB的函数重载,子类和父类的方法视为同级

C#的函数重载,子类优先于父类

VB的Main函数自动加,可以改

//继续成员层

C#的自定义event可以修改add和remove的规则

VB的自定义Event除了C#的之外,还支持重载RaiseEvent语句的用法

VB的Event可以直接书写Event参数,自动生成Delegate类型

C#的event必须指定delegate类型

VB不仅支持WithEvents/Handles静态事件绑定语法,也支持AddHandler动态绑定方法

C#的事件只支持使用+=动态绑定

VB的属性(Property)可以带参数

C#的属性不能带参数

尽管不支持手工定义,VB支持属性按引用传递值,C#不支持

VB可以指定一个带有参数的属性为Default,于是支持索引语法

C#则必须把这个东西声明为索引器,即this语法

VB允许方法带有若干可选参数(Optional)可指定默认值

C#不允许

C#支持out参数,传入前不需要初始化

VB不内置支持

C#支持类中使用fixed buffer,即固定大小的类似数组的成员

VB不支持

C#支持按照参数是否带有ref/out进行函数重载

VB不支持这种重载

C#允许仅大小写区分的两个函数或变量存在

VB不区分大小写,因此也不允许大小写不同的两个函数或变量存在

(成员层一时想不起来了,呆会再想)

//函数层

VB支持局部Static变量

C#不支持

VB支持数组的最后一唯大小可变

C#的数组大小不能改变

VB的Try Catch语句支持Exit Try直接进入Finally

C#无类似语句

VB的Catch可以带When子句,使用.NET的异常filter功能有选择的进行捕获

C#完全不支持这一功能

VB可以使用传统的On Error方法,非结构化地处理异常

C#仅支持结构化

C#支持使用checked语句暂时打开或关闭整数溢出检查

VB仅支持整个项目级别处理

VB支持使用函数名作为返回变量,也支持Return

C#只支持Return

VB的Try, Using, For, For Each等语句支持使用前边定义的变量

C#的对应语句只能在语句开始处定义

C#可以支持unsafe语法有限地支持指针和stack数据的访问

VB不支持

C#支持yield return语法的迭代器生成

VB不支持

C#支持delegate语句就地生成支持closure的匿名方法

VB不支持

C#支持在委托与方法结合的过程中使用协变和反边规则

VB则只能使用完全匹配规则

VB和C#的循环和分支有若干次要差别

C#支持nullable类型的运算符跨类型支持

VB需要手工完成同样功能

VB支持用实例访问类的静态成员

C#只支持类明访问

VB支持按照非虚函数的规则,调用自身类型定义的一个虚函数

C#不支持这一功能

类库层

VB有一个非常好用Microsoft.VisualBasic.dll,实现了许多帮助函数,Application Framework应用程序框架,My命名空间等

C#只能望眼欲穿了……

C#以out/ref或者大小写区分不同函数,这就是不符合CLS的。

VB的每个特性几乎都是CLS兼容的(即使是那些C#不支持的),在VB中使用不会从根本上影响到与C#的交互

语言新特性

Visual Basic8.0

C#2.0

Generics(泛型)

Yes

Yes

Iterators(迭代器)

No

Yes

Anonymous methods(匿名方法)

No

Yes

Operator Overloading(运算符重载)

Yes

Yes (already present)

Partial Classes(不完全类)

Yes

Yes

XML documentation(XML文档)

Yes

Yes (already present)

Static Classes(静态类)

No

Yes

Property Accessor Accessibility

属性访问器的可访问性

Yes

Yes

Namespace Alias Qualifier

名称空间别名限定

Yes

Yes

Unsigned Types

无符号类型

Yes

Yes (already present)

Default Instances

默认实例

Yes

No

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: