VB.NET ve C# Arasındaki Farklar – 1

7 Aralık 2016
Posted by Çağatay Yıldız
3296 Views
C#

Bu yazımızda VB.Net ve c# arasındaki farkları sıralayacağız. İki dil de .Net Framework çatısı altında çalışabilen ve dolayısıyla bir çok kütüphaneden faydalanmaktadır. Kaynak olarak 3 adet makaleden yararlandım. Kaynakları makalenin en altında belirtiyorum.
Her iki dil de nesne yönelimli programlama dili olduğu için bir çok yapı birbirine benzemektedir.

Gelelim farklara
Herşeyden önce belirtmemiz gereken en belirgin fark csharp ın büyük küçük harf duyarlı olmasıdır. Vb de ise böyle bir duyar söz konusu değil. Farkları maddeleştirmek gerekirse;

1) Program Structre ( Genel Programlama Yapısı)

Aşağıdaki örnekte programlama yapısına baktığınızda ilk olarak c# bloklarının scope işaretleriyle kapanması dikkat çekiyor. Vb de ise class ve metot bitişleri ‘End’ kullanılmakta.
VB de kod satır bitişi için herhangi bir şey kullanmazken c# kod bloklarında ‘;’ o satırdaki kodun bittiğini ifade ediyor.
Karar yapısı olarak kullanılan if VB kod bloğunda ‘Then’ kelimesiyle ayrılmış durumda. C# da ise if bloğunun içerisindeki karar yapısı parantez içerisinde belirtilmekte. Ayrıca eşitlik için iki eşit işareti kullanılmaktadır.

VB kodu

Imports System 

Namespace Hello
   Class HelloWorld 
      Overloads Shared Sub Main(ByVal args() As String) 
         Dim name As String = "VB.NET" 

         'See if an argument was passed from the command line
          If args.Length = 1 Then name = args(0) 

          Console.WriteLine("Hello, " & name & "!") 
      End Sub 
   End Class 
End Namespace

c# kodu

using System; 

namespace Hello {
   public class HelloWorld {
      public static void Main(string[] args) {
         string name = "C#";

         // See if an argument was passed from the command line
         if (args.Length == 1)
            name = args[0];

         Console.WriteLine("Hello, " + name + "!");
      }
   }
}

2) Comments Yorum Satırları

Yorum satırı Vb de ‘ işaretiyle başlıyor. Summery ise ”’ ile belirtiliyor. c# da ise yorum satırları / ile başlarken summary ler /// ile başlamakta. Ayrıca bien fazla yorum satırı kullanılma durumda VB de REM kelimesi kullanılırken c# bloğunda /* ile başlayıp */ ile bitmektedir.

VB kodu

Imports System 

Namespace Hello
   Class HelloWorld 
      Overloads Shared Sub Main(ByVal args() As String) 
         Dim name As String = "VB.NET" 

         'See if an argument was passed from the command line
          If args.Length = 1 Then name = args(0) 

          Console.WriteLine("Hello, " & name & "!") 
      End Sub 
   End Class 
End Namespace

c# kodu

using System; 

namespace Hello {
   public class HelloWorld {
      public static void Main(string[] args) {
         string name = "C#";

         // See if an argument was passed from the command line
         if (args.Length == 1)
            name = args[0];

         Console.WriteLine("Hello, " + name + "!");
      }
   }

3) Data Types (Veri Tipleri)

Aşağıdan da anlaşılacağı üzere iki dilde de bir çok veri tipi birbirine benzemektedir. Bunların dışında dikkat çekmemiz gereken bir kaç nokta var.
Anonymous tiplere baktığımızda VB dilinde with anahtar kelimesiyle oluşturulan tipte Key objesinin altında bir tip tanımlanırken c# da buna ihtiyaç duyulmamaktadır
Aynı şekilde with anahtar kelimesiyle isimli bir lokal değişken tanımlerken de with anahtar kelimesi kullanılmaktadır.

VB kodu

Value Types
Boolean
Byte, SByte
Char
Short, UShort, Integer, UInteger, Long, ULong
Single, Double
Decimal
Date   (alias of System.DateTime)
structures
enumerations

Reference Types
objects
String
arrays
delegates

Initializing
Dim correct As Boolean = True
Dim b As Byte = &H2A   'hex or &O52 for octal
Dim person As Object = Nothing
Dim name As String = "Dwight"
Dim grade As Char = "B"c
Dim today As Date = #12/31/2010 12:15:00 PM#
Dim amount As Decimal = 35.99@
Dim gpa As Single = 2.9!
Dim pi As Double = 3.14159265
Dim lTotal As Long = 123456L
Dim sTotal As Short = 123S
Dim usTotal As UShort = 123US
Dim uiTotal As UInteger = 123UI
Dim ulTotal As ULong = 123UL

Nullable Types
Dim x? As Integer = Nothing

Anonymous Types
Dim stu = New With {.Name = "Sue", .Gpa = 3.4}
Dim stu2 = New With {Key .Name = "Bob", .Gpa = 2.9}

Implicitly Typed Local Variables
Dim s = "Hello!"
Dim nums = New Integer() {1, 2, 3}
Dim hero = New SuperHero With {.Name = "Batman"}

Type Information
Dim x As Integer 
Console.WriteLine(x.GetType())          ' System.Int32 
Console.WriteLine(GetType(Integer))   ' System.Int32 
Console.WriteLine(TypeName(x))        ' Integer 

Dim c as New Circle
isShape = TypeOf c Is Shape   ' True if c is a Shape 

isSame = o1 Is o2   // True if o1 and o2 reference same object 
Type Conversion / Casting
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) 

Dim s As New Shape
Dim c As Circle = TryCast(s, Circle)   ' Returns Nothing if type cast fails
c = DirectCast(s, Circle)   ' Throws InvalidCastException if type cast fails

c# kodu

Value Types
bool
byte, sbyte
char
short, ushort, int, uint, long, ulong
float, double
decimal
DateTime   (not a built-in C# type)
structs
enumerations

Reference Types
objects
string
arrays
delegates

Initializing
bool correct = true;
byte b = 0x2A;   // hex
object person = null;
string name = "Dwight";
char grade = 'B';
DateTime today = DateTime.Parse("12/31/2010 12:15:00 PM");
decimal amount = 35.99m;
float gpa = 2.9f;
double pi = 3.14159265;   // or 3.14159265D
long lTotal = 123456L;
short sTotal = 123;
ushort usTotal = 123;
uint uiTotal = 123;   // or 123U
ulong ulTotal = 123;   // or 123UL
Nullable Types
int? x = null;

Anonymous Types
var stu = new {Name = "Sue", Gpa = 3.5};
var stu2 = new {Name = "Bob", Gpa = 2.9};   // no Key equivalent
Implicitly Typed Local Variables
var s = "Hello!";
var nums = new int[] { 1, 2, 3 };
var hero = new SuperHero() { Name = "Batman" };

Type Information
int x;
Console.WriteLine(x.GetType());              // System.Int32
Console.WriteLine(typeof(int));               // System.Int32 
Console.WriteLine(x.GetType().Name);   // Int32 

Circle c = new Circle();
isShape = c is Shape;   // true if c is a Shape	

isSame = Object.ReferenceEquals(o1, o2)   // true if o1 and o2 reference same object

Type Conversion / Casting 
float d = 3.5f; 
i = Convert.ToInt32(d);     // Set to 4 (rounds) 
int i = (int)d;     // set to 3 (truncates decimal)	


Shape s = new Shape();
Circle c = s as Circle;   // Returns null if type cast fails
c = (Circle)s;   // Throws InvalidCastException if type cast fails

4) Enum Yapısı

Enum kullanımında c# kod bloğunda değerler ‘,’ ile ayrılmaktadır. Enum değişkenlerini kullanmak istediğimizde VB tarafında enum değişkenleri toString() metoduyla çevrilmektedir tam tersi olarak enum a değer atadığımız takdirde bunu VB tarafında direkt kullanabilirken c# tarafında int e çevirmek zorundayız. Enumlarla ilgili c# tarafında ileri oop olarak adlandırabileceğimiz makaleyi de yazının sonunda belirtiyorum.

VB kodu

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)     ' "Stop is 1" 

Console.WriteLine(Status.Pass)     ' 70 
Console.WriteLine(Status.Pass.ToString)     ' Pass

c# kodu

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);    // "Stop is 1"

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

5) Operatörler

Operatörlerde göze çarpan en önemli değişiklik ve, veya gibi karar yapılarında kullanılan syntax lardır. Bunun haricinde kod bloklarında ara sıra kullandığımız mod alma yapısıda göze çarpıyor

VB kodu

Comparison
=  <  >  <=  >=  <>

Arithmetic
+  -  *  /
Mod
\  (integer division)
^  (raise to a power)

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

Bitwise
And   Or   Xor   Not   <<   >>

Logical
AndAlso   OrElse   And   Or   Xor   Not

Note: AndAlso and OrElse perform short-circuit logical evaluations

String Concatenation
&

c# kodu

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
+

6) Karar Yapıları

Karar yapılarında tek satır if kullanımlarında Vb tarafında ‘,’ c# tarafında ise ‘?’ kullanılmakta. Diğer if ve else if bloklarında daha önce belirttiğimiz gibi then anahtar kelimesi kullanılmaktadır.
Ayrıca switch case bloklarında da c# tarafında ‘:’ ve break komutu kullanılmaktadır. Ayrıca default anahtar kelimesine karşılık VB tarafında case else kullanılmakta.

VB kodu

 Null-coalescing operator if called with 2 arguments
x = If(y, 5)   ' if y is not Nothing then x = y, else x = 5

' Ternary/Conditional operator (IIf evaluates 2nd and 3rd expressions)
greeting = If(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 AndAlso y < 5 Then x *= 5 : y *= 2  

' Preferred
If x <> 100 AndAlso y < 5 Then
  x *= 5 
  y *= 2
End If

' Use _ to break up long single line or use implicit line break
If whenYouHaveAReally < longLine And 
  itNeedsToBeBrokenInto2 > Lines Then _
  UseTheUnderscore(charToBreakItUp)

'If x > 5 Then 
  x *= y 
ElseIf x = 5 OrElse y Mod 2 = 0 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

c# kodu

// Null-coalescing operator
x = y ?? 5;   // if y != null then x = y, else x = 5

// Ternary/Conditional operator
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 || y % 2 == 0) 
  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
}

7) Döngüler
Döngülerde dikkatimizi çeken c# da ‘++’ kullanımı. c# da iki artı işaretiyle değişken bir artmaktadır. Örneğin bir VB kodunda c += 1 olarak arttırılan rakam c# da ayrıca c++; olarak da arttırılabilir. Döngülerdeki iki artı işaretinin anlamı budur. Bunun dışında — de geçerlidir.

VB kodu

For n = 1 To 10 
   MsgBox("The number is " & n)
Next

For Each prop In obj
    prop = 42
Next prop

c# kodu

for (int i = 1; i <= 10; i++) 
   Console.WriteLine(
      "The number is {0}", i);
foreach(prop current in obj)
{
   current=42;
}

8) Diziler
Dizilerde basit syntax farkları dışında herhangi bir fark iki dilde de yok. Sadece Resize dizi kullanımında ref anahtar kelimesi dikkatimizi çekiyor. ref anahtar kelimesi referans yoluyla kelimenin metoda geçmesini sağlamaktadır.

vb kodu

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

c# kodu

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 

// Add two elements, keeping the existing values
Array.Resize(ref names, 7);

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;

7) Metotlar

Metotlarda dikkatimizi çeken dizilerde de belirttiğimiz ref anahtar kelimesi. c# kod bloğunda TestFunc ismideki metodun kullanımına dikkat ettiğinizde eğer mevcut bir değişkeni ref tipinde metoda yollarsak kod bloğunun devamında o değişken değişmektedir. out kullanımının nedeni ise bir atama yapmadan metoda yollama imkanı sunmasıdır.

VB kodu

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

c# kodu

// 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# 4.0 supports optional parameters. Previous versions required function overloading. */  
void SayHello(string name, string prefix = "") {
  Console.WriteLine("Greetings, " + prefix + " " + name);
} 

SayHello("Strangelove", "Dr.");
SayHello("Mom");

Vb ve C# arasındaki farklara 2. makalemizde devam edeceğiz.

Enum kullanımı kaynak:
https://www.codeproject.com/articles/808001/diving-in-oop-day-understanding-enums-in-csharp-a

Diğer kaynaklar
http://www.harding.edu/fmccown/vbnet_csharp_comparison.html
https://www.codeproject.com/articles/9978/complete-comparison-for-vb-net-and-c
https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET#Keywords