VB.NET and C# 语法比较手册

比较|语法

VB.NET and C# Comparison
This is a quick reference guide to highlight some key syntactical differences between VB.NETand C#. Hope you find this useful!
Thank you to Tom Shelton, Fergus Cooney, and others for your input.

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

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

时间: 2024-10-28 11:49:22

VB.NET and C# 语法比较手册的相关文章

【项目求合作】想做个关于vb.net的开发速查手册,有意者前来报名

问题描述 如题,我想做一个关于vb.net的开发速查手册,包括常用的方法.属性.数据类型.类--总之,一切以用为本,兼顾学习功能,方便广大vb.net码农们编程和学习.适用开发水平:20%~80%(当然80%以上也可以来看看,顺便纠错,谢谢!)收录内容常用度:100%~40%手册格式:PDF.XPS.DOC主要分类:数据.输入数据.处理数据.输出数据比如在处理数据中的If语句可以这么写:[作用]根据表达式的值有条件地执行一组语句.{编者注:引自MSDN}[格式]'多行语法Ifcondition[

SQL 语法参考手册(SQL)

参考|参考手册|语法|语法参考 SQL 语法参考手册(SQL) DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的*作,包含了资料的定义(DDL)以及资料的处理(DML).SQL原来拼成SEQUEL,这语言的原型以"系统 R"的名字在 IBM 圣荷西实验室完成,经过IBM内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R

基本语法 - PHP手册笔记

原文:基本语法 - PHP手册笔记 PHP标记 如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记.这可以避免在PHP结束标记之后万一意外加入了空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出的意图.当然PHP开始标记<?php前的空格或者换行符依然会输出. 使用条件的高级分离术 下面这段代码的意思很容易理解,关键是if-else的用法,这样使用在文本输出是显的逻辑更加清晰. <?php $expression = false; ?> <?php if

SQL 语法参考手册

参考|参考手册|语法|语法参考 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language), 是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都 必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料 的处理(DML).SQL原来拼成 SEQUEL,这语言的原型以"系统 R"的名 字在 IBM 圣荷西实验室完成,经过 IBM 内部及其他的许多使用性及效率测试, 其结果相当令人满意,并决定在系统R 的技术基础发展出

SQL语法参考手册

sql语法|参考|参考手册|语法参考 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料的处理(DML).SQL原来拼成SEQUEL,这语言的原型以"系统 R"的名字在 IBM 圣荷西实验室完成,经过IBM内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM

vb.net和c#语法比较

比较|语法 由于一些人对vb.net和c#选择方面存在一些困惑,其实只是语法习惯问题,我把它们的语法列出来比较一下,大家有个感性认识. 1.变量声名  C# 语法  int x;  String s;  String s1, s2;  Object o;  Object obj = new Object();  public String name;  VB语法  Dim x As Integer  Dim s As String  Dim s1, s2 As String  Dim o 'Im

关于C#和VB.net的一个语法对比问题

问题描述 在vb.net中,使用如下代码不会有问题:DimtasString="123"DimiasNewList(OfInteger)i.Add(0)Integer.TryParse(t,i(0))运行之后,最后一句会把t转换成Integer型,并赋值给i中的第一个元素,于是最后的效果是i(0)的值变为123.没问题.而翻译成C#,如下:Stringt="123";List<Int>i=newList<Int>();i.add(0);Int

VB.NET自我总结语法

   导入命名空间.Imports System 一.(1)定义一个变量,并且初始化.      Dim strText As String = ""      或 者      Dim strText As String       strText=""    (2)实例化一个类或对象      Dim openFileDialog1 As New OpenFileDialog()      Dim clsClass As New ClsClass()     (

VB.NET基础语法

很久以来,VB因为缺乏完善的面向对象支持.缺乏高效的错误处理机制和性能表现不佳,因而一直受到某些人的嘲笑.VB.NET将彻底改变这种情况.然而,VB.NET在这些方面的改进也要付出代价,许多旧的代码需要手工进行转换才能在VB.NET下运行. 下面几个表格总结了VB.NET语言在语法上的改动之处.注意这些表格并没有完全列出所有改动之处,但列出了最重要的一些改动. 表A对比了VB6中一些熟悉的语法形式及其在VB.NET中类似功能最接近的语法形式. 表A:语法对比旧语法 新语法 说明窗体装载事件,类初