(Notes) Notes (2020)

Why Microsoft vilified Visual Basic ?


I see a simple reason. Because VB based on C# syntax (C was born in 1978), VB is improving C ancient syntax for RAPID development, in VB we newer will use "+" as adding integer value, as concatenate string and even adding event to class, this is full different conception. In VB we newer use stupid char ";", we newer use reversy to you mind syntax, we newer use ":" as Implement and Inherit keyword simultaneously, this is full different conception in VB, but even experienced C# always confused in this simplest sentences, in VB we always operate with address in memory as address due to keyword AddressOF, in VB we newer confuse what is Delegate, what in Event (because we use keyword AddHandler, Handles and RaiseEvent), any C# programmer differ one this simple one from another with big difficulties. In other side in C# absolutely similar stuff as Property and Method without parameters we can perform with parentheses or without it. Simple idea as dynamic variable was exist since VB was born but this simplest stuff is appear only in last version of stupid C# syntax. In VB Lambda-expression is simplest conception because you always can replace Lambda to AddressOF another function, you always understand difference what is Address of something and what is calling something in memory address, but how is possible to aware what is "=>"? There are thousands improvements, I have no time to enumerate them.

Microsoft said that sour cream and shit from pan is the same, because they has the same fat content and sugar content. No, sorry, VB programmer understand differences between shit and cream, between stupid ancient C syntax and improving this shit syntax in VB.NET. And VB programmers always have understanding reason of Microsoft point of view - big goal of Microsoft is increase price of software in whole world, and than increase MS stock in stock market as leader of software development company. Because in practice VB program can easier for understanding, for example I have program with 300,000 and 600,000 string of my VB code and this my program is still easy to understand by other VB programmer, is any C# programmer can understand 25,000 string of code from other C# programmer?. VB programmer can create program in 10 times faster and cheaper than the same program in C# (look to any freelance venue as proof), but this price reduce of any program in whole world is fully rejected by Microsoft, than MS return to stupid C syntax from 1978 year.

C# programmers is always "follow the rules" programmers, Microsoft rules, rules to increase price of any program. C# programmers has special kind of mind that always obey to any Microsoft rules, master-slave pattern of their mind and relation to Microsoft point of view never can them create really good programs, only programs with maximum price.



For example look to the starting ASP.NET Core application at all, especially in DI container and what first page will be selected to start. If you have write in Classic APS.NET you sure that common environment to start and first page is pretty simple. You need to know nothing rather than - first page is Default.aspx (this page is defined in web server or in Visaul Studio). And all common environment is defined in global.asax. Nothing other you must be know. Even routing concept is too much, need only write a couple string of code in global.asax (like in the bottom of this page ASP.NET URL rewriting and thats is. Nothing else you need to know.

If you want create more sophisticated web site, you have various opportunity to create page dynamically - for example in this way SPA-page на Classic ASP.NET та jQuery. or use UpdatePanel techniques, like in this page Долгоиграющие странички с прогресс-баром.. Since 2002 year, since ASP.NET was born, you also can use WebAPI How classic ASP.NET programmers has realized WEB.API since 2005 year and also we could create page in asynchronous way and even first ORM (Linq-to-SQL) was born - Асинхронные странички. All this task was be extremely simple in Classic ASP.NET and 15 year ago we can create for one day the same site what we can create today during a month or more.

Than Microsoft done one-by-one some important steps:


And what we have as common result of Microsoft efforts? What this bull is achieve in IT industry? W Why now we need a month to create the same site was created 15 year ago during one day? Look at scheme below - this is configuring process of start Blazor application and selecting start page. Instead nothing in Classic ASP.NET.



Do I wait anything from MS? Yes, one important step will be repair MS reputation for me. If MS will said - Yes, we agree mistake, C# is too stupid and ancient syntax for programming, we newer will use it again. We will return to RAPID style of programming, for human-like language for programming and in future we always support only B# language based on VB.NET.


About 0,5 million peoples write in VB.NET full automatically, without thinking at all, like breathing, and doing this 25+ years, but ... MS create new languages F# instead support VB.NET further. After huge efforts and spent a lot of money for advertise only 10 thousand peoples try to use that scrap. Why MS doing this terrible thing? No answer other, than obvious to me. VB.NET is too fast, too successful and software has low price for end-user, therefore VB.NET forbidden by Microsoft.

And look to my VB-C# comparing below, and try to understand what is language for professionals and what is scrap for beginners?




Preprocessor directives
NameSpace
Control flow
Events/delegates
Variables
Adding string, numeric, float, delegate
Compare
Null (Nothing)
in C# is absent:
Access modifier
Instantiate
OOP keywords
Type check and conversion
In C# is absent built-in conversion
Other keywords
MultiThreading
Generic
Pointer operators
Logical and bitwise
Array access
Math operation
Other modifiers
In C# is absent


VB.NET (2005), (2010), (2015), (2017), (2020)C# (2020)
Program Structure
   1:  Imports System
   2:   
   3:  Namespace Hello
   4:     Class HelloWorld
   5:        Overloads Shared Sub Main(ByVal args() As String)
   6:           Dim name As String = "VB.NET"
   7:   
   8:           'See if an argument was passed from the command line
   9:            If args.Length = 1 Then name = args(0)
  10:   
  11:            Console.WriteLine("Hello, " & name & "!")
  12:        End Sub
  13:     End Class
  14:  End Namespace 
   1:  using System;
   2:   
   3:  namespace Hello {
   4:     public class HelloWorld {
   5:        public static void Main(string[] args) {
   6:           string name = "C#";
   7:   
   8:           // See if an argument was passed from the command line
   9:           if (args.Length == 1)
  10:              name = args[0];
  11:           Console.WriteLine("Hello, " + name + "!");
  12:        }
  13:     }
  14:  } 
Comments
   1:  ' Single line only
   2:   
   3:  REM Single line only
   4:   
   5:  ''' <summary>XML comments</summary>
   1:  // Single line
   2:  /* Multiple
   3:      line  */
   4:  /// <summary>XML comments on single line</summary>
   5:  /** <summary>XML comments on multiple lines</summary> */
Data Types
   1:  'Value Types
   2:  Boolean
   3:  Byte, SByte
   4:  Char
   5:  Short, UShort, Integer, UInteger, Long, ULong
   6:  Single, Double
   7:  Decimal
   8:  Date   (alias of System.DateTime)
   9:  structures
  10:  enumerations
  11:   
  12:  'Reference Types
  13:  objects
  14:  String
  15:  arrays
  16:  delegates
  17:   
  18:  'Initializing
  19:  Dim correct As Boolean = True
  20:  Dim b As Byte = &H2A   'hex or &O52 for octal
  21:  Dim person As Object = Nothing
  22:  Dim name As String = "Dwight"
  23:  Dim grade As Char = "B"c
  24:  Dim today As Date = #12/31/2010 12:15:00 PM#
  25:  Dim amount As Decimal = 35.99@
  26:  Dim gpa As Single = 2.9!
  27:  Dim pi As Double = 3.14159265
  28:  Dim lTotal As Long = 123456L
  29:  Dim sTotal As Short = 123S
  30:  Dim usTotal As UShort = 123US
  31:  Dim uiTotal As UInteger = 123UI
  32:  Dim ulTotal As ULong = 123UL
  33:   
  34:  'Nullable Types
  35:  Dim x? As Integer = Nothing
  36:   
  37:  'Anonymous Types
  38:  Dim stu = New With {.Name = "Sue", .Gpa = 3.4}
  39:  Dim stu2 = New With {Key .Name = "Bob", .Gpa = 2.9}
  40:   
  41:  'Implicitly Typed Local Variables
  42:  Dim s = "Hello!"
  43:  Dim nums = New Integer() {1, 2, 3}
  44:  Dim hero = New SuperHero With {.Name = "Batman"}
  45:   
  46:  'Type Information
  47:  Dim x As Integer
  48:  Console.WriteLine(x.GetType())          ' System.Int32
  49:  Console.WriteLine(GetType(Integer))   ' System.Int32
  50:  Console.WriteLine(TypeName(x))        ' Integer
  51:   
  52:  Dim c as New Circle
  53:  isShape = TypeOf c Is Shape   ' True if c is a Shape
  54:  isSame = o1 Is o2   // True if o1 and o2 reference same object
  55:   
  56:  'Type Conversion / Casting
  57:  Dim d As Single = 3.5
  58:  Dim i As Integer = CType(d, Integer)   ' set to 4 (Banker's rounding)
  59:  i = CInt(d)  ' same result as CType
  60:  i = Int(d)    ' set to 3 (Int function truncates the decimal)
  61:   
  62:  Dim s As New Shape
  63:  Dim c As Circle = TryCast(s, Circle)   ' Returns Nothing if type cast fails
  64:  c = DirectCast(s, Circle)   ' Throws InvalidCastException if type cast fails 
   1:  //Value Types
   2:  bool
   3:  byte, sbyte
   4:  char
   5:  short, ushort, int, uint, long, ulong
   6:  float, double
   7:  decimal
   8:  DateTime   (not a built-in C# type)
   9:  structs
  10:  enumerations
  11:   
  12:  //Reference Types
  13:  objects
  14:  string
  15:  arrays
  16:  delegates
  17:   
  18:  //Initializing
  19:  bool correct = true;
  20:  byte b = 0x2A;   // hex
  21:  object person = null;
  22:  string name = "Dwight";
  23:  char grade = 'B';
  24:  DateTime today = DateTime.Parse("12/31/2010 12:15:00 PM");
  25:  decimal amount = 35.99m;
  26:  float gpa = 2.9f;
  27:  double pi = 3.14159265;   // or 3.14159265D
  28:  long lTotal = 123456L;
  29:  short sTotal = 123;
  30:  ushort usTotal = 123;
  31:  uint uiTotal = 123;   // or 123U
  32:  ulong ulTotal = 123;   // or 123UL
  33:   
  34:  //Nullable Types
  35:  int? x = null;
  36:   
  37:  //Anonymous Types
  38:  var stu = new {Name = "Sue", Gpa = 3.5};
  39:  var stu2 = new {Name = "Bob", Gpa = 2.9};   // no Key equivalent
  40:   
  41:  //Implicitly Typed Local Variables
  42:  var s = "Hello!";
  43:  var nums = new int[] { 1, 2, 3 };
  44:  var hero = new SuperHero() { Name = "Batman" };
  45:   
  46:  //Type Information
  47:  int x;
  48:  Console.WriteLine(x.GetType());              // System.Int32
  49:  Console.WriteLine(typeof(int));               // System.Int32
  50:  Console.WriteLine(x.GetType().Name);   // Int32
  51:   
  52:  Circle c = new Circle();
  53:  isShape = c is Shape;   // true if c is a Shape    
  54:   
  55:  isSame = Object.ReferenceEquals(o1, o2)   // true if o1 and o2 reference same object
  56:   
  57:  //Type Conversion / Casting
  58:  float d = 3.5f;
  59:  i = Convert.ToInt32(d);     // Set to 4 (rounds)
  60:  int i = (int)d;     // set to 3 (truncates decimal)    
  61:   
  62:  Shape s = new Shape();
  63:  Circle c = s as Circle;   // Returns null if type cast fails
  64:  c = (Circle)s;   // Throws InvalidCastException if type cast fails
Constants
   1:  Const MAX_STUDENTS As Integer = 25
   2:   
   3:  ' Can set to a const or var; may be initialized in a constructor
   4:  ReadOnly MIN_DIAMETER As Single = 4.93 
   1:  const int MAX_STUDENTS = 25;
   2:   
   3:  // Can set to a const or var; may be initialized in a constructor
   4:  readonly float MIN_DIAMETER = 4.93f; 
Enumerations
   1:  Enum Action
   2:    Start 
   3:    [Stop]   ' Stop is a reserved word
   4:    Rewind
   5:    Forward
   6:  End Enum
   7:   
   8:  Enum Status
   9:    Flunk = 50
  10:    Pass = 70
  11:    Excel = 90
  12:  End Enum
  13:   
  14:  Dim a As Action = Action.Stop
  15:  If a <> Action.Start Then _
  16:     Console.WriteLine(a.ToString & " is " & a)     ' "Stop is 1"
  17:   
  18:  Console.WriteLine(Status.Pass)     ' 70
  19:  Console.WriteLine(Status.Pass.ToString)     ' Pass
   1:  enum Action {Start, Stop, Rewind, Forward};
   2:  enum Status {Flunk = 50, Pass = 70, Excel = 90};
   3:   
   4:  Action a = Action.Stop;
   5:  if (a != Action.Start)
   6:    Console.WriteLine(a + " is " + (int) a);    // "Stop is 1"
   7:   
   8:  Console.WriteLine((int) Status.Pass);    // 70
   9:  Console.WriteLine(Status.Pass);      // Pass
Operators
   1:  'Comparison
   2:  =  <  >  <=  >=  <>
   3:   
   4:  'Arithmetic
   5:  +  -  *  /
   6:  Mod
   7:  \  (integer division)
   8:  ^  (raise to a power)
   9:   
  10:  'Assignment
  11:  =  +=  -=  *=  /=  \=  ^=  <<=  >>=  &=
  12:   
  13:  'Bitwise
  14:  And   Or   Xor   Not   <<   >>
  15:   
  16:  'Logical
  17:  AndAlso   OrElse   And   Or   Xor   Not
  18:   
  19:  'Note: AndAlso and OrElse perform short-circuit logical evaluations
  20:   
  21:  'String Concatenation
  22:  & 
   1:  //Comparison
   2:  ==  <  >  <=  >=  !=
   3:   
   4:  //Arithmetic
   5:  +  -  *  /
   6:  %  (mod)
   7:  /  (integer division if both operands are ints)
   8:  Math.Pow(x, y)
   9:   
  10:  //Assignment
  11:  =  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --
  12:   
  13:  //Bitwise
  14:  &   |   ^   ~   <<   >>
  15:   
  16:  //Logical
  17:  &&   ||   &   |   ^   !
  18:   
  19:  //Note: && and || perform short-circuit logical evaluations
  20:   
  21:  //String Concatenation
  22:  +
Choices
   1:  ' Null-coalescing operator if called with 2 arguments
   2:  x = If(y, 5)   ' if y is not Nothing then x = y, else x = 5
   3:   
   4:  ' Ternary/Conditional operator (IIf evaluates 2nd and 3rd expressions)
   5:  greeting = If(age < 20, "What's up?", "Hello")
   6:   
   7:  ' One line doesn't require "End If"
   8:  If age < 20 Then greeting = "What's up?"
   9:  If age < 20 Then greeting = "What's up?" Else greeting = "Hello"
  10:   
  11:  ' Use : to put two commands on same line
  12:  If x <> 100 AndAlso y < 5 Then x *= 5 : y *= 2  
  13:   
  14:  ' Preferred
  15:  If x <> 100 AndAlso y < 5 Then
  16:    x *= 5
  17:    y *= 2
  18:  End If
  19:   
  20:  ' Use _ to break up long single line or use implicit line break
  21:  If whenYouHaveAReally < longLine And
  22:    itNeedsToBeBrokenInto2 > Lines Then _
  23:    UseTheUnderscore(charToBreakItUp)
  24:   
  25:  'If x > 5 Then
  26:    x *= y
  27:  ElseIf x = 5 OrElse y Mod 2 = 0 Then
  28:    x += y
  29:  ElseIf x < 10 Then
  30:    x -= y
  31:  Else
  32:    x /= y
  33:  End If
  34:   
  35:  Select Case color   ' Must be a primitive data type
  36:    Case "pink", "red"
  37:      r += 1
  38:    Case "blue"
  39:      b += 1
  40:    Case "green"
  41:      g += 1
  42:    Case Else
  43:      other += 1
  44:  End Select 
   1:  // Null-coalescing operator
   2:  x = y ?? 5;   // if y != null then x = y, else x = 5
   3:   
   4:  // Ternary/Conditional operator
   5:  greeting = age < 20 ? "What's up?" : "Hello";
   6:   
   7:  if (age < 20)
   8:    greeting = "What's up?";
   9:  else
  10:    greeting = "Hello";
  11:   
  12:  // Multiple statements must be enclosed in {}
  13:  if (x != 100 && y < 5) {   
  14:    x *= 5;
  15:    y *= 2;
  16:  }
  17:   
  18:   
  19:  No need for _ or : since ; is used to terminate each statement.
  20:   
  21:   
  22:   
  23:  if (x > 5)
  24:    x *= y;
  25:  else if (x == 5 || y % 2 == 0)
  26:    x += y;
  27:  else if (x < 10)
  28:    x -= y;
  29:  else
  30:    x /= y;
  31:   
  32:   
  33:   
  34:  // Every case must end with break or goto case
  35:  switch (color) {                          // Must be integer or string
  36:    case "pink":
  37:    case "red":    r++;    break;
  38:    case "blue":   b++;   break;
  39:    case "green": g++;   break;
  40:    default:    other++;   break;       // break necessary on default
  41:  } 
Loops
   1:  'Pre-test Loops:
   2:  While c < 10
   3:    c += 1
   4:  End While     
   5:   
   6:  Do Until c = 10 
   7:    c += 1
   8:  Loop
   9:   
  10:  Do While c < 10
  11:    c += 1
  12:  Loop     
  13:   
  14:  For c = 2 To 10 Step 2
  15:    Console.WriteLine(c)
  16:  Next
  17:   
  18:  'Post-test Loops:
  19:  Do 
  20:    c += 1
  21:  Loop While c < 10     
  22:   
  23:  Do 
  24:    c += 1
  25:  Loop Until c = 10
  26:   
  27:  '  Array or collection looping
  28:  Dim names As String() = {"Fred", "Sue", "Barney"}
  29:  For Each s As String In names
  30:    Console.WriteLine(s)
  31:  Next
  32:   
  33:  ' Breaking out of loops
  34:  Dim i As Integer = 0
  35:  While (True)
  36:    If (i = 5) Then Exit While
  37:    i += 1
  38:  End While
  39:   
  40:  ' Continue to next iteration
  41:  For i = 0 To 4
  42:    If i < 4 Then Continue For
  43:    Console.WriteLine(i)   ' Only prints 4
  44:  Next 
   1:  //Pre-test Loops:  
   2:   
   3:  // no "until" keyword
   4:  while (c < 10)
   5:    c++;
   6:   
   7:   
   8:  for (c = 2; c <= 10; c += 2)
   9:    Console.WriteLine(c);
  10:   
  11:   
  12:   
  13:   
  14:   
  15:   
  16:   
  17:   
  18:  //Post-test Loop:
  19:   
  20:  do
  21:    c++;
  22:  while (c < 10);
  23:   
  24:   
  25:  // Array or collection looping
  26:  string[] names = {"Fred", "Sue", "Barney"};
  27:  foreach (string s in names)
  28:    Console.WriteLine(s);
  29:   
  30:   
  31:  // Breaking out of loops
  32:  int i = 0;
  33:  while (true) {
  34:    if (i == 5)
  35:      break;
  36:    i++;
  37:  }
  38:   
  39:  // Continue to next iteration
  40:  for (i = 0; i <= 4; i++) {
  41:    if (i < 4)
  42:      continue;
  43:    Console.WriteLine(i);   // Only prints 4
  44:  } 
Arrays
   1:  Dim nums() As Integer = {1, 2, 3} 
   2:  For i As Integer = 0 To nums.Length - 1
   3:    Console.WriteLine(nums(i))
   4:  Next
   5:   
   6:  ' 4 is the index of the last element, so it holds 5 elements
   7:  Dim names(4) As String
   8:  names(0) = "David"
   9:  names(5) = "Bobby"  ' Throws System.IndexOutOfRangeException
  10:   
  11:  ' Resize the array, keeping the existing values (Preserve is optional)
  12:  ReDim Preserve names(6)
  13:   
  14:  Dim twoD(rows-1, cols-1) As Single
  15:  twoD(2, 0) = 4.5
  16:   
  17:  Dim jagged()() As Integer = { _
  18:    New Integer(4) {}, New Integer(1) {}, New Integer(2) {} }
  19:  jagged(0)(4) = 5 
   1:  int[] nums = {1, 2, 3};
   2:  for (int i = 0; i < nums.Length; i++)
   3:    Console.WriteLine(nums[i]);
   4:   
   5:   
   6:  // 5 is the size of the array
   7:  string[] names = new string[5];
   8:  names[0] = "David";
   9:  names[5] = "Bobby";   // Throws System.IndexOutOfRangeException
  10:   
  11:  // Add two elements, keeping the existing values
  12:  Array.Resize(ref names, 7);
  13:   
  14:  float[,] twoD = new float[rows, cols];
  15:  twoD[2,0] = 4.5f; 
  16:   
  17:  int[][] jagged = new int[3][] {
  18:    new int[5], new int[2], new int[3] };
  19:  jagged[0][4] = 5; 
Collections
   1:  ' Popular classes in System.Collections (stored as Object)
   2:  ArrayList
   3:  Hashtable
   4:  Queue
   5:  Stack
   6:   
   7:  'Popular classes in System.Collections.Generic (stored as type T)
   8:  List(Of T)
   9:  SortedList(Of TKey, TValue)
  10:  Dictionary(Of TKey, TValue)
  11:  Queue(Of T)
  12:  Stack(Of T)
  13:   
  14:  'Popular classes in System.Collections.Concurrent (thread safe)
  15:  BlockingCollection(Of T)
  16:  ConcurrentDictionary(Of TKey, TValue)
  17:  ConcurrentQueue(Of T)
  18:  ConcurrentStack(Of T)
  19:   
  20:  'Microsoft.VisualBasic (not recommended)
  21:  Collection
  22:   
  23:   
  24:  ' Store ID and name
  25:  Dim students As New Dictionary(Of Integer, String) From
  26:  {
  27:    {123, "Bob"},
  28:    {444, "Sue"},
  29:    {555, "Jane"}
  30:  }
  31:   
  32:  students.Add(987, "Gary")
  33:  Console.WriteLine(students(444))   ' Sue
  34:   
  35:  ' Display all
  36:  For Each stu In students
  37:    Console.WriteLine(stu.Key & " = " & stu.Value)
  38:  Next
  39:   
  40:  ' Method iterator for custom iteration over a collection
  41:  Iterator Function OddNumbers(ByVal lastNum As Integer) As System.Collections.IEnumerable
  42:    For num = 1 To lastNum
  43:      If num Mod 2 = 1 Then
  44:        Yield num
  45:      End If
  46:    Next
  47:  End Function
  48:   
  49:  ' 1 3 5 7
  50:  For Each num In OddNumbers(7)
  51:    Console.Write(num & " ")
  52:  Next
   1:  // Popular classes in System.Collections (stored as Object)
   2:  ArrayList
   3:  Hashtable
   4:  Queue
   5:  Stack
   6:   
   7:  //Popular classes in System.Collections.Generic (stored as type T)
   8:  List<T>
   9:  SortedList<TKey, TValue>
  10:  Dictionary<TKey, TValue>
  11:  Queue<T>
  12:  Stack<T>
  13:   
  14:  //Popular classes in System.Collections.Concurrent (thread safe)
  15:  BlockingCollection<T>
  16:  ConcurrentDictionary<TKey, TValue>
  17:  ConcurrentQueue<T>
  18:  ConcurrentStack<T>
  19:   
  20:  //No equivalent to Microsoft.VisualBasic.Collection
  21:   
  22:   
  23:  // Store ID and name
  24:  var students = new Dictionary<int, string>
  25:  {
  26:    { 123, "Bob" },
  27:    { 444, "Sue" },
  28:    { 555, "Jane" }
  29:  };
  30:   
  31:  students.Add(987, "Gary");
  32:  Console.WriteLine(students[444]);   // Sue
  33:   
  34:  // Display all
  35:  foreach (var stu in students) {
  36:    Console.WriteLine(stu.Key + " = " + stu.Value);
  37:  }
  38:   
  39:   
  40:  // Method iterator for custom iteration over a collection
  41:  static System.Collections.Generic.IEnumerable<int> OddNumbers(int lastNum)
  42:  {
  43:    for (var num = 1; num <= lastNum; num++)
  44:      if (num % 2 == 1)
  45:        yield return num;
  46:  }
  47:   
  48:  // 1 3 5 7
  49:  foreach (double num in OddNumbers(7))
  50:  {
  51:    Console.Write(num + " ");
  52:  }
Functions
   1:  ' Pass by value (in, default), reference (in/out), and reference (out) 
   2:  Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
   3:    x += 1
   4:    y += 1
   5:    z = 5
   6:  End Sub
   7:   
   8:  Dim a = 1, b = 1, c As Integer   ' c set to zero by default 
   9:  TestFunc(a, b, c)
  10:  Console.WriteLine("{0} {1} {2}", a, b, c)   ' 1 2 5
  11:   
  12:  ' Accept variable number of arguments
  13:  Function Sum(ByVal ParamArray nums As Integer()) As Integer
  14:    Sum = 0 
  15:    For Each i As Integer In nums
  16:      Sum += i
  17:    Next
  18:  End Function   ' Or use Return statement like C#
  19:   
  20:  Dim total As Integer = Sum(4, 3, 2, 1)   ' returns 10
  21:   
  22:  ' Optional parameters must be listed last and must have a default value
  23:  Sub SayHello(ByVal name As String, Optional ByVal prefix As String = "")
  24:    Console.WriteLine("Greetings, " & prefix & " " & name)
  25:  End Sub
  26:   
  27:  SayHello("Strangelove", "Dr.")
  28:  SayHello("Mom")
   1:  // Pass by value (in, default), reference (in/out), and reference (out)
   2:  void TestFunc(int x, ref int y, out int z) {
   3:    x++;  
   4:    y++;
   5:    z = 5;
   6:  }
   7:   
   8:  int a = 1, b = 1, c;  // c doesn't need initializing
   9:  TestFunc(a, ref b, out c);
  10:  Console.WriteLine("{0} {1} {2}", a, b, c);  // 1 2 5
  11:   
  12:  // Accept variable number of arguments
  13:  int Sum(params int[] nums) {
  14:    int sum = 0;
  15:    foreach (int i in nums)
  16:      sum += i;
  17:    return sum;
  18:  }
  19:   
  20:  int total = Sum(4, 3, 2, 1);   // returns 10
  21:   
  22:  /* C# 4.0 supports optional parameters. Previous versions required function overloading. */ 
  23:  void SayHello(string name, string prefix = "") {
  24:    Console.WriteLine("Greetings, " + prefix + " " + name);
  25:  } 
  26:   
  27:  SayHello("Strangelove", "Dr.");
  28:  SayHello("Mom"); 
Strings
   1:  'Special character constants (all also accessible from ControlChars class)
   2:  vbCrLf, vbCr, vbLf, vbNewLine
   3:  vbNullString
   4:  vbTab
   5:  vbBack
   6:  vbFormFeed
   7:  vbVerticalTab
   8:  ""
   9:   
  10:  ' String concatenation (use & or +)
  11:  Dim school As String = "Harding" & vbTab
  12:  school = school & "University"   ' school is "Harding (tab) University"
  13:  school &= "University"   ' Same thing (+= does the same)    
  14:   
  15:  ' Chars
  16:  Dim letter As Char = school.Chars(0)   ' letter is H
  17:  letter = "Z"c                                         ' letter is Z
  18:  letter = Convert.ToChar(65)                ' letter is A
  19:  letter = Chr(65)                                 ' same thing
  20:  Dim word() As Char = school.ToCharArray ' word holds Harding
  21:   
  22:  ' No string literal operator
  23:  Dim filename As String = "c:\temp\x.dat"
  24:   
  25:  ' String comparison
  26:  Dim mascot As String = "Bisons"
  27:  If (mascot = "Bisons") Then   ' true
  28:  If (mascot.Equals("Bisons")) Then   ' true
  29:  If (mascot.ToUpper().Equals("BISONS")) Then  ' true
  30:  If (mascot.CompareTo("Bisons") = 0) Then   ' true
  31:   
  32:  ' String matching with Like - Regex is more powerful
  33:  If ("John 3:16" Like "Jo[Hh]? #:*") Then   'true
  34:   
  35:  ' Substring
  36:  s = mascot.Substring(2, 3)) ' son
  37:  s = Mid("testing", 2, 3)   ' est
  38:   
  39:  ' Replacement
  40:  s = mascot.Replace("sons", "nomial")) ' s is "Binomial"
  41:   
  42:  ' Split
  43:  Dim names As String = "Michael,Dwight,Jim,Pam"
  44:  Dim parts() As String = names.Split(",".ToCharArray())   ' One name in each slot
  45:   
  46:  ' Date to string
  47:  Dim dt As New DateTime(1973, 10, 12)
  48:  Dim s As String = "My birthday: " & dt.ToString("MMM dd, yyyy")   ' Oct 12, 1973
  49:   
  50:  ' Integer to String
  51:  Dim x As Integer = 2
  52:  Dim y As String = x.ToString()     ' y is "2"
  53:   
  54:  ' String to Integer
  55:  Dim x As Integer = Convert.ToInt32("-5")     ' x is -5
  56:   
  57:  ' Mutable string
  58:  Dim buffer As New System.Text.StringBuilder("two ")
  59:  buffer.Append("three ")
  60:  buffer.Insert(0, "one ")
  61:  buffer.Replace("two", "TWO")
  62:  Console.WriteLine(buffer)         ' Prints "one TWO three" 
   1:  //Escape sequences
   2:  \r    // carriage-return
   3:  \n    // line-feed
   4:  \t    // tab
   5:  \\    // backslash
   6:  \"    // quote"
   7:   
   8:   
   9:  // String concatenation
  10:  string school = "Harding\t";
  11:  school = school + "University";   // school is "Harding (tab) University"
  12:  school += "University";   // Same thing
  13:   
  14:  // Chars
  15:  char letter = school[0];            // letter is H
  16:  letter = 'Z';                               // letter is Z
  17:  letter = Convert.ToChar(65);     // letter is A
  18:  letter = (char)65;                    // same thing
  19:  char[] word = school.ToCharArray();   // word holds Harding
  20:   
  21:  // String literal
  22:  string filename = @"c:\temp\x.dat";   // Same as "c:\\temp\\x.dat"
  23:   
  24:  // String comparison
  25:  string mascot = "Bisons";
  26:  if (mascot == "Bisons")    // true
  27:  if (mascot.Equals("Bisons"))   // true
  28:  if (mascot.ToUpper().Equals("BISONS"))   // true
  29:  if (mascot.CompareTo("Bisons") == 0)    // true
  30:   
  31:  // String matching - No Like equivalent, use Regex
  32:   
  33:   
  34:  // Substring
  35:  s = mascot.Substring(2, 3))     // son
  36:  s = "testing".Substring(1, 3);   // est (no Mid)
  37:   
  38:  // Replacement
  39:  s = mascot.Replace("sons", "nomial"))     // Binomial
  40:   
  41:  // Split
  42:  string names = "Michael,Dwight,Jim,Pam";
  43:  string[] parts = names.Split(",".ToCharArray());   // One name in each slot
  44:   
  45:  // Date to string
  46:  DateTime dt = new DateTime(1973, 10, 12);
  47:  string s = dt.ToString("MMM dd, yyyy");     // Oct 12, 1973
  48:   
  49:  // int to string
  50:  int x = 2;
  51:  string y = x.ToString();     // y is "2"
  52:  // string to int
  53:  int x = Convert.ToInt32("-5");     // x is -5
  54:   
  55:  // Mutable string
  56:  System.Text.StringBuilder buffer = new System.Text.StringBuilder("two ");
  57:  buffer.Append("three ");
  58:  buffer.Insert(0, "one ");
  59:  buffer.Replace("two", "TWO");
  60:  Console.WriteLine(buffer);     // Prints "one TWO three"
Regular Expressions
   1:   Imports System.Text.RegularExpressions
   2:   
   3:  ' Match a string pattern
   4:  Dim r As New Regex("j[aeiou]h?. \d:*", RegexOptions.IgnoreCase Or _
   5:          RegexOptions.Compiled)
   6:  If (r.Match("John 3:16").Success) Then   'true
   7:      Console.WriteLine("Match")
   8:  End If
   9:   
  10:  ' Find and remember all matching patterns
  11:  Dim s As String = "My number is 305-1881, not 305-1818."
  12:  Dim r As New Regex("(\d+-\d+)")
  13:  Dim m As Match = r.Match(s)     ' Matches 305-1881 and 305-1818
  14:  While m.Success
  15:      Console.WriteLine("Found number: " & m.Groups(1).Value & " at position " _
  16:              & m.Groups(1).Index.ToString)
  17:      m = m.NextMatch()
  18:  End While
  19:   
  20:  ' Remeber multiple parts of matched pattern
  21:  Dim r As New Regex("(\d\d):(\d\d) (am|pm)")
  22:  Dim m As Match = r.Match("We left at 03:15 pm.")
  23:  If m.Success Then
  24:      Console.WriteLine("Hour: " & m.Groups(1).ToString)       ' 03
  25:      Console.WriteLine("Min: " & m.Groups(2).ToString)         ' 15
  26:      Console.WriteLine("Ending: " & m.Groups(3).ToString)   ' pm
  27:  End If
  28:   
  29:  ' Replace all occurrances of a pattern
  30:  Dim r As New Regex("h\w+?d", RegexOptions.IgnoreCase)
  31:  Dim s As String = r.Replace("I heard this was HARD!", "easy")   ' I easy this was easy!
  32:   
  33:  ' Replace matched patterns
  34:  Dim s As String = Regex.Replace("123 < 456", "(\d+) . (\d+)", "$2 > $1")   ' 456 > 123
  35:   
  36:  ' Split a string based on a pattern
  37:  Dim names As String = "Michael, Dwight, Jim, Pam"
  38:  Dim r As New Regex(",\s*")
  39:  Dim parts() As String = r.Split(names)   ' One name in each slot 
   1:  using System.Text.RegularExpressions;
   2:   
   3:  // Match a string pattern
   4:  Regex r = new Regex(@"j[aeiou]h?. \d:*", RegexOptions.IgnoreCase |
   5:          RegexOptions.Compiled);
   6:  if (r.Match("John 3:16").Success)   // true
   7:      Console.WriteLine("Match");
   8:   
   9:   
  10:  // Find and remember all matching patterns
  11:  string s = "My number is 305-1881, not 305-1818.";
  12:  Regex r = new Regex("(\\d+-\\d+)");
  13:  // Matches 305-1881 and 305-1818
  14:  for (Match m = r.Match(s); m.Success; m = m.NextMatch())
  15:      Console.WriteLine("Found number: " + m.Groups[1] + " at position " +
  16:          m.Groups[1].Index);
  17:   
  18:   
  19:   
  20:  // Remeber multiple parts of matched pattern
  21:  Regex r = new Regex("@(\d\d):(\d\d) (am|pm)");
  22:  Match m = r.Match("We left at 03:15 pm.");
  23:  if (m.Success) {
  24:      Console.WriteLine("Hour: " + m.Groups[1]);       // 03
  25:      Console.WriteLine("Min: " + m.Groups[2]);         // 15
  26:      Console.WriteLine("Ending: " + m.Groups[3]);   // pm
  27:  }
  28:   
  29:  // Replace all occurrances of a pattern
  30:  Regex r = new Regex("h\\w+?d", RegexOptions.IgnoreCase);
  31:  string s = r.Replace("I heard this was HARD!", "easy"));   // I easy this was easy!
  32:   
  33:  // Replace matched patterns
  34:  string s = Regex.Replace("123 < 456", @"(\d+) . (\d+)", "$2 > $1");   // 456 > 123
  35:   
  36:  // Split a string based on a pattern
  37:  string names = "Michael, Dwight, Jim, Pam";
  38:  Regex r = new Regex(@",\s*");
  39:  string[] parts = r.Split(names);   // One name in each slot 
Exception Handling
   1:  ' Throw an exception
   2:  Dim ex As New Exception("Something is really wrong.")
   3:  Throw  ex 
   4:   
   5:  ' Catch an exception
   6:  Try 
   7:    y = 0
   8:    x = 10 / y
   9:  Catch ex As Exception When y = 0 ' Argument and When is optional
  10:    Console.WriteLine(ex.Message)
  11:  Finally
  12:    Beep()
  13:  End Try
  14:   
  15:  ' Deprecated unstructured error handling
  16:  On Error GoTo MyErrorHandler
  17:  ...
  18:  MyErrorHandler: Console.WriteLine(Err.Description)
   1:  Exception up = new Exception("Something is really wrong.");
   2:  throw up;  // ha ha
   3:   
   4:  // Catch an exception
   5:  try { 
   6:    y = 0;
   7:    x = 10 / y;
   8:  }
   9:  catch (Exception ex) {   // Argument is optional, no "When" keyword 
  10:    Console.WriteLine(ex.Message);
  11:  }
  12:  finally {
  13:    Microsoft.VisualBasic.Interaction.Beep();
  14:  } 
Namespaces
   1:  Namespace Harding.Compsci.Graphics 
   2:    ...
   3:  End Namespace
   4:   
   5:  ' or
   6:   
   7:  Namespace Harding
   8:    Namespace Compsci
   9:      Namespace Graphics 
  10:        ...
  11:      End Namespace
  12:    End Namespace
  13:  End Namespace
  14:   
  15:  Imports Harding.Compsci.Graphics 
   1:  namespace Harding.Compsci.Graphics {
   2:    ...
   3:  }
   4:   
   5:  // or
   6:   
   7:  namespace Harding {
   8:    namespace Compsci {
   9:      namespace Graphics {
  10:        ...
  11:      }
  12:    }
  13:  }
  14:   
  15:  using Harding.Compsci.Graphics; 
Attributes
   1:  ' Attribute can be applied to anything
   2:  Public Class IsTestedAttribute
   3:      Inherits Attribute
   4:  End Class
   5:   
   6:  ' Attribute can only be applied to classes or structs
   7:  <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Struct)>
   8:  Public Class AuthorAttribute
   9:      Inherits Attribute
  10:   
  11:      Public Property Name As String
  12:      Public Property Version As Integer = 0
  13:   
  14:      Public Sub New(ByVal name As String)
  15:          Me.Name = name
  16:      End Sub
  17:  End Class
  18:   
  19:  <Author("Sue", Version:=3)>
  20:  Class Shape
  21:   
  22:      <IsTested()>
  23:      Sub Move()
  24:          ' Do something...
  25:      End Sub
  26:  End Class
   1:  // Attribute can be applied to anything
   2:  public class IsTestedAttribute : Attribute
   3:  {
   4:  }
   5:   
   6:  // Attribute can only be applied to classes or structs
   7:  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
   8:  public class AuthorAttribute : Attribute {
   9:   
  10:      public string Name { get; set; }
  11:      public int Version { get; set; }
  12:   
  13:      public AuthorAttribute(string name) {
  14:          Name = name;
  15:          Version = 0;
  16:      }
  17:  }
  18:   
  19:  [Author("Sue", Version = 3)]
  20:  class Shape {
  21:   
  22:      [IsTested]
  23:      void Move() {
  24:          // Do something...
  25:      }
  26:  }
Classes & Interfaces
   1:  'Access Modifiers
   2:  Public
   3:  Private
   4:  Friend
   5:  Protected
   6:  Protected Friend
   7:   
   8:  'Class Modifiers
   9:  MustInherit
  10:  NotInheritable
  11:   
  12:  'Method Modifiers
  13:  MustOverride
  14:  NotInheritable
  15:  Shared
  16:  Overridable
  17:   
  18:  ' All members are Shared
  19:  Module
  20:   
  21:  ' Partial classes
  22:  Partial Class Team
  23:    ...
  24:    Protected name As String
  25:    Public Overridable Sub DisplayName()
  26:      Console.WriteLine(name)
  27:    End Sub
  28:  End Class 
  29:   
  30:  ' Inheritance
  31:  Class FootballTeam
  32:    Inherits Team
  33:    ...
  34:    Public Overrides Sub DisplayName()
  35:      Console.WriteLine("** " + name + " **")
  36:    End Sub
  37:  End Class 
  38:   
  39:  ' Interface definition
  40:  Interface IAlarmClock
  41:    Sub Ring()
  42:    Property TriggerDateTime() As DateTime
  43:  End Interface
  44:   
  45:  ' Extending an interface
  46:  Interface IAlarmClock
  47:    Inherits IClock
  48:    ...
  49:  End Interface
  50:   
  51:  ' Interface implementation
  52:  Class WristWatch 
  53:    Implements IAlarmClock, ITimer
  54:   
  55:    Public Sub Ring() Implements IAlarmClock.Ring
  56:      Console.WriteLine("Wake up!")
  57:    End Sub
  58:   
  59:    Public Property TriggerDateTime As DateTime Implements IAlarmClock.TriggerDateTime
  60:    ...
  61:  End Class 
   1:  //Access Modifiers
   2:  public
   3:  private
   4:  internal
   5:  protected
   6:  protected internal
   7:   
   8:  //Class Modifiers
   9:  abstract
  10:  sealed
  11:  static
  12:   
  13:  //Method Modifiers
  14:  abstract
  15:  sealed
  16:  static
  17:  virtual
  18:   
  19:  //No Module equivalent - just use static class
  20:   
  21:  // Partial classes
  22:  partial class Team {
  23:    ...
  24:    protected string name;
  25:    public virtual void DislpayName() {
  26:      Console.WriteLine(name);
  27:  }
  28:   
  29:   
  30:  // Inheritance
  31:  class FootballTeam : Team {
  32:    ...
  33:    public override void DislpayName() {
  34:      Console.WriteLine("** " + name + " **");
  35:    }
  36:  }
  37:   
  38:   
  39:  // Interface definition
  40:  interface IAlarmClock {
  41:    void Ring();
  42:    DateTime CurrentDateTime { get; set; }
  43:  }
  44:   
  45:  // Extending an interface 
  46:  interface IAlarmClock : IClock {
  47:    ...
  48:  }
  49:   
  50:   
  51:  // Interface implementation
  52:  class WristWatch : IAlarmClock, ITimer {
  53:   
  54:    public void Ring() {
  55:      Console.WriteLine("Wake up!");
  56:    }
  57:   
  58:    public DateTime TriggerDateTime { get; set; }
  59:    ...
  60:  } 
Constructors & Destructors
   1:  Class SuperHero
   2:    Inherits Person
   3:   
   4:    Private powerLevel As Integer
   5:    Private name As String
   6:   
   7:    ' Default constructor
   8:    Public Sub New()
   9:      powerLevel = 0
  10:      name = "Super Bison"
  11:    End Sub
  12:   
  13:    Public Sub New(ByVal powerLevel As Integer)
  14:      Me.New("Super Bison")   ' Call other constructor
  15:      Me.powerLevel = powerLevel
  16:    End Sub
  17:   
  18:    Public Sub New(ByVal name As String)
  19:      MyBase.New(name)   ' Call base classes' constructor
  20:      Me.name = name
  21:    End Sub
  22:   
  23:    Shared Sub New()
  24:      ' Shared constructor invoked before 1st instance is created
  25:    End Sub
  26:   
  27:    Protected Overrides Sub Finalize() 
  28:     ' Destructor to free unmanaged resources
  29:      MyBase.Finalize()
  30:    End Sub
  31:  End Class
   1:  class SuperHero : Person {
   2:   
   3:    private int powerLevel;
   4:    private string name;
   5:   
   6:   
   7:    // Default constructor
   8:    public SuperHero() {
   9:      powerLevel = 0;
  10:      name = "Super Bison";
  11:    }
  12:   
  13:    public SuperHero(int powerLevel)
  14:      : this("Super Bison") {   // Call other constructor
  15:      this.powerLevel = powerLevel; 
  16:    }
  17:   
  18:    public SuperHero(string name)
  19:      : base(name) {   // Call base classes' constructor
  20:      this.name = name;
  21:    }
  22:   
  23:    static SuperHero() {
  24:      // Static constructor invoked before 1st instance is created
  25:    }
  26:   
  27:    ~SuperHero() {
  28:      // Destructor implicitly creates a Finalize method
  29:    }
  30:   
  31:  }
Using Objects
   1:  Dim hero As SuperHero = New SuperHero
   2:  ' or
   3:  Dim hero As New SuperHero
   4:   
   5:  With hero
   6:    .Name = "SpamMan"
   7:    .PowerLevel = 3
   8:  End With
   9:   
  10:  hero.Defend("Laura Jones")
  11:  hero.Rest()     ' Calling Shared method
  12:  ' or
  13:  SuperHero.Rest()
  14:   
  15:  Dim hero2 As SuperHero = hero  ' Both reference the same object
  16:  hero2.Name = "WormWoman"
  17:  Console.WriteLine(hero.Name)   ' Prints WormWoman
  18:   
  19:  hero = Nothing    ' Free the object
  20:   
  21:  If hero Is Nothing Then _
  22:    hero = New SuperHero
  23:   
  24:  Dim obj As Object = New SuperHero
  25:  If TypeOf obj Is SuperHero Then _
  26:    Console.WriteLine("Is a SuperHero object.")
  27:   
  28:  ' Mark object for quick disposal
  29:  Using reader As StreamReader = File.OpenText("test.txt")
  30:    Dim line As String = reader.ReadLine()
  31:    While Not line Is Nothing
  32:      Console.WriteLine(line)
  33:      line = reader.ReadLine()
  34:    End While
  35:  End Using 
   1:  SuperHero hero = new SuperHero();
   2:   
   3:   
   4:   
   5:  // No "With" but can use object initializers
   6:  SuperHero hero = new SuperHero() { Name = "SpamMan", PowerLevel = 3 };
   7:   
   8:  hero.Defend("Laura Jones");
   9:  SuperHero.Rest();   // Calling static method
  10:   
  11:   
  12:   
  13:  SuperHero hero2 = hero;   // Both reference the same object
  14:  hero2.Name = "WormWoman";
  15:  Console.WriteLine(hero.Name);   // Prints WormWoman
  16:   
  17:  hero = null ;   // Free the object
  18:   
  19:  if (hero == null)
  20:    hero = new SuperHero();
  21:   
  22:  Object obj = new SuperHero(); 
  23:  if (obj is SuperHero)
  24:    Console.WriteLine("Is a SuperHero object.");
  25:  // Mark object for quick disposal
  26:  using (StreamReader reader = File.OpenText("test.txt")) {
  27:    string line;
  28:    while ((line = reader.ReadLine()) != null)
  29:      Console.WriteLine(line);
  30:  } 
Structs
   1:  Structure Student
   2:    Public name As String
   3:    Public gpa As Single
   4:   
   5:    Public Sub New(ByVal name As String, ByVal gpa As Single)
   6:      Me.name = name
   7:      Me.gpa = gpa
   8:    End Sub
   9:  End Structure
  10:   
  11:  Dim stu As Student = New Student("Bob", 3.5)
  12:  Dim stu2 As Student = stu  
  13:   
  14:  stu2.name = "Sue"
  15:  Console.WriteLine(stu.name)    ' Prints Bob
  16:  Console.WriteLine(stu2.name)  ' Prints Sue
   1:  struct Student {
   2:    public string name;
   3:    public float gpa;
   4:   
   5:    public Student(string name, float gpa) {
   6:      this.name = name;
   7:      this.gpa = gpa;
   8:    }
   9:  }
  10:   
  11:  Student stu = new Student("Bob", 3.5f);
  12:  Student stu2 = stu;  
  13:   
  14:  stu2.name = "Sue";
  15:  Console.WriteLine(stu.name);    // Prints Bob
  16:  Console.WriteLine(stu2.name);   // Prints Sue
Properties
   1:  ' Auto-implemented properties are new to VB10
   2:  Public Property Name As String
   3:  Public Property Size As Integer = -1     ' Default value, Get and Set both Public
   4:   
   5:  ' Traditional property implementation
   6:  Private mName As String
   7:  Public Property Name() As String
   8:      Get
   9:          Return mName
  10:      End Get
  11:      Set(ByVal value As String)
  12:          mName = value
  13:      End Set
  14:  End Property
  15:   
  16:  ' Read-only property
  17:  Private mPowerLevel As Integer
  18:  Public ReadOnly Property PowerLevel() As Integer
  19:      Get
  20:          Return mPowerLevel
  21:      End Get
  22:  End Property
  23:   
  24:  ' Write-only property
  25:  Private mHeight As Double
  26:  Public WriteOnly Property Height() As Double
  27:      Set(ByVal value As Double)
  28:          mHeight = If(value < 0, mHeight = 0, mHeight = value)
  29:      End Set
  30:  End Property 
   1:   // Auto-implemented properties
   2:  public string Name { get; set; }
   3:  public int Size { get; protected set; }     // Set default value in constructor
   4:   
   5:  // Traditional property implementation
   6:  private string name;
   7:  public string Name {
   8:    get {
   9:      return name;
  10:    }
  11:    set {
  12:      name = value;
  13:    }
  14:  }
  15:   
  16:  // Read-only property
  17:  private int powerLevel;
  18:  public int PowerLevel {
  19:    get {
  20:      return powerLevel;
  21:    }
  22:  }
  23:   
  24:  // Write-only property
  25:  private double height;
  26:  public double Height {
  27:    set {
  28:      height = value < 0 ? 0 : value;
  29:    }
  30:  } 
Generics
   1:   ' Enforce accepted data type at compile-time
   2:  Dim numbers As New List(Of Integer)
   3:  numbers.Add(2)
   4:  numbers.Add(4)
   5:  DisplayList(Of Integer)(numbers)
   6:   
   7:  ' Subroutine can display any type of List
   8:  Sub DisplayList(Of T)(ByVal list As List(Of T))
   9:      For Each item As T In list
  10:          Console.WriteLine(item)
  11:      Next
  12:  End Sub
  13:   
  14:  ' Class works on any data type
  15:  Class SillyList(Of T)
  16:      Private list(10) As T
  17:      Private rand As New Random
  18:   
  19:      Public Sub Add(ByVal item As T)
  20:          list(rand.Next(10)) = item
  21:      End Sub
  22:   
  23:      Public Function GetItem() As T
  24:          Return list(rand.Next(10))
  25:      End Function
  26:  End Class
  27:   
  28:  ' Limit T to only types that implement IComparable
  29:  Function Maximum(Of T As IComparable)(ByVal ParamArray items As T()) As T
  30:      Dim max As T = items(0)
  31:      For Each item As T In items
  32:          If item.CompareTo(max) > 0 Then max = item
  33:      Next
  34:      Return max
  35:  End Function
   1:   // Enforce accepted data type at compile-time
   2:  List<int> numbers = new List<int>();
   3:  numbers.Add(2);
   4:  numbers.Add(4);
   5:  DisplayList<int>(numbers);
   6:   
   7:  // Function can display any type of List
   8:  void DisplayList<T>(List<T> list) {
   9:      foreach (T item in list)
  10:          Console.WriteLine(item);
  11:  }
  12:   
  13:  // Class works on any data type
  14:  class SillyList<T> {
  15:      private T[] list = new T[10];
  16:      private Random rand = new Random();
  17:   
  18:      public void Add(T item) {
  19:          list[rand.Next(10)] = item;
  20:      }
  21:   
  22:      public T GetItem() {
  23:          return list[rand.Next(10)];
  24:      }
  25:  }
  26:   
  27:  // Limit T to only types that implement IComparable
  28:  T Maximum<T>(params T[] items) where T : IComparable<T> {
  29:      T max = items[0];
  30:      foreach (T item in items)
  31:          if (item.CompareTo(max) > 0)
  32:              max = item;
  33:      return max;
  34:  }
Events
   1:  Delegate Sub MsgArrivedEventHandler(ByVal message As String)
   2:   
   3:  Event MsgArrivedEvent As MsgArrivedEventHandler
   4:   
   5:  ' or to define an event which declares a delegate implicitly
   6:  Event MsgArrivedEvent(ByVal message As String)
   7:   
   8:  AddHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback
   9:  ' Won't throw an exception if obj is Nothing
  10:  RaiseEvent MsgArrivedEvent("Test message")
  11:  RemoveHandler MsgArrivedEvent, AddressOf My_MsgArrivedCallback
  12:   
  13:  Imports System.Windows.Forms
  14:   
  15:  Dim WithEvents MyButton As Button   ' WithEvents can't be used on local variable
  16:  MyButton = New Button
  17:   
  18:  Sub MyButton_Click(ByVal sender As System.Object, _
  19:    ByVal e As System.EventArgs) Handles MyButton.Click
  20:    MessageBox.Show(Me, "Button was clicked", "Info", _
  21:      MessageBoxButtons.OK, MessageBoxIcon.Information)
  22:  End Sub
   1:  delegate void MsgArrivedEventHandler(string message);
   2:   
   3:  event MsgArrivedEventHandler MsgArrivedEvent;
   4:   
   5:  // Delegates must be used with events in C#
   6:   
   7:   
   8:  MsgArrivedEvent += new MsgArrivedEventHandler(My_MsgArrivedEventCallback);
   9:  MsgArrivedEvent("Test message");    // Throws exception if obj is null
  10:  MsgArrivedEvent -= new MsgArrivedEventHandler(My_MsgArrivedEventCallback);
  11:   
  12:   
  13:   
  14:  using System.Windows.Forms;
  15:   
  16:  Button MyButton = new Button(); 
  17:  MyButton.Click += new System.EventHandler(MyButton_Click);
  18:   
  19:  void MyButton_Click(object sender, System.EventArgs e) {
  20:    MessageBox.Show(this, "Button was clicked", "Info",
  21:      MessageBoxButtons.OK, MessageBoxIcon.Information);
  22:  }
Delegates & Lambda Expressions
   1:   Delegate Sub HelloDelegate(ByVal s As String)
   2:   
   3:  Sub SayHello(ByVal s As String)
   4:    Console.WriteLine("Hello, " & s)
   5:  End Sub
   6:  ' Create delegate that calls SayHello
   7:  Dim hello As HelloDelegate = AddressOf SayHello
   8:  hello("World")   ' Or hello.Invoke("World")
   9:   
  10:  ' Use lambda expression (anonymous method) instead of a delegate
  11:  Dim hello2 = Sub(x) Console.WriteLine("Hello, " & x)
  12:  hello2("World")
  13:   
  14:   
  15:   
  16:   
  17:   
  18:   
  19:  ' Use Func(Of T, TResult) delegate to call Uppercase
  20:  Dim convert As Func(Of String, String) = AddressOf Uppercase
  21:  Console.WriteLine(convert("test"))
  22:   
  23:  Function Uppercase(s As String) As String
  24:    Return s.ToUpper
  25:  End Function
  26:   
  27:  ' Declare and invoke lambda expression
  28:  Console.WriteLine((Function(num As Integer) num + 1)(2))
  29:   
  30:  ' Pass lambda expression as an argument
  31:  TestValues(Function(x, y) x Mod y = 0)
  32:   
  33:  Sub TestValues(ByVal f As Func(Of Integer, Integer, Boolean))
  34:    If f(8, 4) Then
  35:      Console.WriteLine("true")
  36:    Else
  37:      Console.WriteLine("false")
  38:    End If
  39:  End Sub 
   1:   delegate void HelloDelegate(string s);
   2:   
   3:  void SayHello(string s) {
   4:    Console.WriteLine("Hello, " + s);
   5:  }
   6:   
   7:  // C# 1.0 delegate syntax with named method
   8:  HelloDelegate hello = new HelloDelegate(SayHello);
   9:  hello("World");   // Or hello.Invoke("World");
  10:   
  11:  // C# 2.0 delegate syntax with anonymous method
  12:  HelloDelegate hello2 = delegate(string s) {
  13:    Console.WriteLine("Hello, " + s);
  14:  };
  15:  hello2("World");
  16:   
  17:  // C# 3.0 delegate syntax with lambda expression
  18:  HelloDelegate hello3 = s => { Console.WriteLine("Hello, " + s); };
  19:  hello3("World");
  20:   
  21:  // Use Func<in T, out TResult> delegate to call Uppercase
  22:  Func<string, string> convert = Uppercase;
  23:  Console.WriteLine(convert("test"));
  24:   
  25:  string Uppercase(string s) {
  26:    return s.ToUpper();
  27:  }
  28:   
  29:  // Declare and invoke Func using a lambda expression
  30:  Console.WriteLine(new Func<int, int>(num => num + 1)(2));
  31:   
  32:  // Pass lamba expression as an argument
  33:  TestValues((x, y) => x % y == 0);
  34:   
  35:  void TestValues(Func<int, int, bool> f) {
  36:    if (f(8, 4))
  37:      Console.WriteLine("true");
  38:    else
  39:      Console.WriteLine("false");
  40:  } 
Extension Methods
   1:   Imports System.Runtime.CompilerServices
   2:   
   3:  Module StringExtensions
   4:    <Extension()>
   5:    Public Function VowelCount(ByVal s As String) As Integer
   6:      Return s.Count(Function(c) "aeiou".Contains(Char.ToLower(c)))
   7:    End Function
   8:  End Module
   9:   
  10:  ' Using the extension method
  11:  Console.WriteLine("This is a test".VowelCount) 
   1:   public static class StringExtensions {
   2:    public static int VowelCount(this string s) {
   3:      return s.Count(c => "aeiou".Contains(Char.ToLower(c)));
   4:    }
   5:  }
   6:   
   7:   
   8:   
   9:  // Using the extension method
  10:  Console.WriteLine("This is a test".VowelCount()); 
LINQ
   1:  Dim nums() As Integer = {5, 8, 2, 1, 6}
   2:   
   3:  ' Get all numbers in the array above 4
   4:  Dim results = From n In nums
   5:                    Where n > 4
   6:                    Select n
   7:   
   8:  ' Same thing using lamba expression
   9:  results = nums.Where(Function(n) n > 4)
  10:   
  11:  ' Displays 5 8 6
  12:  For Each n As Integer In results
  13:      Console.Write(n & " ")
  14:  Next
  15:   
  16:  Console.WriteLine(results.Count())     ' 3
  17:  Console.WriteLine(results.First())     ' 5
  18:  Console.WriteLine(results.Last())     ' 6
  19:  Console.WriteLine(results.Average())     ' 6.33333
  20:   
  21:  results = results.Intersect({5, 6, 7})     ' 5 6
  22:  results = results.Concat({5, 1, 5})     ' 5 6 5 1 5
  23:  results = results.Distinct()     ' 5 6 1
  24:   
  25:  Dim Students() As Student = {
  26:      New Student With {.Name = "Bob", .Gpa = 3.5},
  27:      New Student With {.Name = "Sue", .Gpa = 4.0},
  28:      New Student With {.Name = "Joe", .Gpa = 1.9}
  29:  }
  30:   
  31:  ' Get a list of students ordered by Gpa with Gpa >= 3.0
  32:  Dim goodStudents = From s In Students
  33:              Where s.Gpa >= 3.0
  34:              Order By s.Gpa Descending
  35:              Select s
  36:   
  37:  Console.WriteLine(goodStudents.First.Name)     ' Sue
   1:  int[] nums = { 5, 8, 2, 1, 6 };
   2:   
   3:  // Get all numbers in the array above 4
   4:  var results = from n in nums
   5:                  where n > 4
   6:                  select n;
   7:   
   8:  // Same thing using lamba expression
   9:  results = nums.Where(n => n > 4);
  10:   
  11:  // Displays 5 8 6
  12:  foreach (int n in results)
  13:      Console.Write(n + " ");
  14:   
  15:   
  16:  Console.WriteLine(results.Count());     // 3
  17:  Console.WriteLine(results.First());     // 5
  18:  Console.WriteLine(results.Last());     // 6
  19:  Console.WriteLine(results.Average());     // 6.33333
  20:   
  21:  results = results.Intersect(new[] {5, 6, 7});     // 5 6
  22:  results = results.Concat(new[] {5, 1, 5});     // 5 6 5 1 5
  23:  results = results.Distinct();     // 5 6 1
  24:   
  25:  Student[] Students = {
  26:      new Student{ Name = "Bob", Gpa = 3.5 },
  27:      new Student{ Name = "Sue", Gpa = 4.0 },
  28:      new Student{ Name = "Joe", Gpa = 1.9 }
  29:  };
  30:   
  31:  // Get a list of students ordered by Gpa with Gpa >= 3.0
  32:  var goodStudents = from s in Students
  33:              where s.Gpa >= 3.0
  34:              orderby s.Gpa descending
  35:              select s;
  36:   
  37:  Console.WriteLine(goodStudents.First().Name);     // Sue
Razor syntax (Special ASP.NET tags)
   1:  'Implicit expression    
   2:  @name Hello, <b>@name.</b> 
   3:   
   4:  'Explicit expression    
   5:  @(5+5) Hello, @name. Your age is: <b>@(5+5).</b> 
   6:   
   7:  'Unencoded expression    
   8:  @Html.Raw(name) Hello, <b>@Html.Raw(name).</b> 
   9:   
  10:  'Multi-statement code blocks    
  11:  @Code
  12:          /* VB.NET Code goes here */
  13:  End Code 
  14:  @Code
  15:      Dim greeting = "Hello, world!"
  16:      For i = 1 To 3
  17:          @<p>@greeting (@i)</p>
  18:          Next i
  19:  End Code
  20:   
  21:  'Plain text inside a code block    
  22:  @Code
  23:      @:Plain text goes here
  24:  End Code 
  25:  @If IsPost Then
  26:      Dim text = "Code goes here..."
  27:      @:Plain text goes here...
  28:  End If
  29:   
  30:  'Plain text inside a code block (alternative)    
  31:  @<text>Plain text goes here...</text> 
  32:  @If IsPost Then
  33:      Dim text = "Code goes here..."
  34:      @<text>Plain text goes here...</text>
  35:  End If 
  36:   
  37:  'Server-side comment    
  38:  @*
  39:      Here's a Razor server-side comment
  40:      It won't be rendered to the browser
  41:      It can span multiple lines
  42:  *@
  43:   
  44:  'Conditional attribute (New in MVC 4)    
  45:  <div style="@divStyle">Hello, world!</div> 
  46:  @Code
  47:      Dim divStyle As String
  48:      If Request.QueryString("style") IsNot Nothing Then
  49:          divStyle = "background-color: yellow;"
  50:      End If
  51:  End Code
  52:  <div style="@divStyle">Hello, world!</div> 
   1:  //Implicit expression    
   2:  @name Hello, <b>@name.</b> 
   3:   
   4:  //Explicit expression    
   5:  @(5+5) Hello, @name. Your age is: <b>@(5+5).</b> 
   6:   
   7:  //Unencoded expression    
   8:  @Html.Raw(name) Hello, <b>@Html.Raw(name).</b> 
   9:   
  10:  //Multi-statement code blocks    
  11:  @{
  12:          /* C# Code goes here */
  13:  } 
  14:  @{
  15:      var greeting = "Hello, world!";
  16:      for(int i = 1; i <= 3; i++)
  17:      {
  18:          <p>@greeting (@i)</p>
  19:      }
  20:  }
  21:   
  22:  //Plain text inside a code block    
  23:  @:Plain text goes here... 
  24:  @if(isTrue)
  25:  {
  26:      var text = "Code goes here...";
  27:      @:Plain text goes here...
  28:  } 
  29:   
  30:  //Plain text inside a code block (alternative)    
  31:  <text>Plain text goes here...</text> 
  32:  @if(isTrue)
  33:  {
  34:      var text = "Code goes here...";
  35:      <text>Plain text goes here...</text>
  36:  } 
  37:   
  38:  //Server-side comment
  39:  @*
  40:      Here's a Razor server-side comment
  41:      It won't be rendered to the browser
  42:      It can span multiple lines
  43:  *@ 
  44:   
  45:  //Conditional attribute (New in MVC 4)     
  46:  <div style="@divStyle">Hello, world!</div>
  47:  @{
  48:      string divStyle = null;
  49:      if(Request.QueryString["style"] != null)
  50:      {
  51:          divStyle = "background-color: yellow;";
  52:      }
  53:  }
  54:  <div style="@divStyle">Hello, world!</div>


Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20
Link to this page: http://www.vb-net.com/WhyMicrosoftVilifiedVisualBasic/Index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <MAIL ME>  <ABOUT ME>  < THANKS ME>