zoukankan      html  css  js  c++  java
  • VB.NET and C# Comparison


    VB.NET Program Structure C#
    ' Single line only
    Rem  Single line only

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

    VB.NET Data Types C#

    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.NET Constants C#
    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.NET Enumerations C#
    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.NET Operators C#

    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.NET Choices C#

    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.NET Loops C#
    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.NET Arrays C#

    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.NET Functions C#

    ' 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.NET Strings C#

    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.NET Exception Handling C#

    ' 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.NET Namespaces C#

    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.NET Classes / Interfaces C#

    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.NET Constructors / Destructors C#
    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.NET Using Objects C#

    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.NET Structs C#

    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.NET Properties C#

    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.NET Delegates / Events C#

    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.NET Console I/O C#

    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.NET File I/O C#

    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 documentationXML文档)

    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



  • 相关阅读:
    jProfiler远程连接Linux监控jvm的运行状态
    Linux性能监控分析命令(五)—free命令介绍
    Linux性能监控分析命令(三)—iostat命令介绍
    Python编程练习题学习汇总
    OSPF与ACL综合应用实验
    ACL基础知识点总结
    NAT基础知识点
    VLAN实验五:利用三层交换机实现VLAN间路由
    VLAN实验四:利用单臂路由实现VLAN间路由
    VLAN实验三:理解Hybrid接口
  • 原文地址:https://www.cnblogs.com/sekihin/p/813630.html
  • Copyright © 2011-2022 走看看
    Creative Commons License 本作品采用 知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。