Heralde kodlama yaptığım sürede u diziler(ve dizimsiler) kadar kafamı karıştıran birşey olmamıştır. Şimdi bunlara bi bakalım,. Örneklerde basitlik olması adına tek boyutlu dizilerden bahsedilecektir.
Syntax'a baktıgımızda aşağıdaki dillerden VB kökenli dillerde dizi parantezi normal parantez yani () iken, diğer dillerde köşeli parantez yani [] şeklinde ifade edilir. Ve yine VB kökenli dillerde bu parentez dizi değişkeninin yanına yazılırken, diğerlerinde veri tipinin yanına yazılır.
Base(taban)
VBA:Varsayılan değer 0'dır, ancak Option Base 1 yapılarak baz 1'den başlatılabilir. (ParamArray'ler hariç). Benim tavsiyem, varsayılan değeri bozmayın ve 0'dan başlatın ve bunu alışkanlık haline getirin, yoksa diğer dillerle çalışmaya başladığınızda karmaşa yaşayabilirsiniz. Baz index değeri VBA'de Lbound
fonksiyonu ile bulunabilir ve bu metod çoğu durumda 0 döndürecektir.
VBA'de cells, worksheets gibi bazı collection üyelerinin indexi 1'den başlar
ve bu değiştirilemez.
VB.Net:VBA 'de yazılı olanlar burda da geçerlidir. Ancak
baz index değeri VBA'de Lbound fonksiyonu ile
bulunurken VB:Net'te GetLowerBound bulunabilir.
C#:Varsayılan değer 0'dır. Optiona Base gibi bir seçenek yoktur, ancak wrapper class yazarak istenilen indexten başlatılabilir(bence gereksizdir)
Javascript:Varsayılan değer 0'dır.
Bu arada, tüm dillerde, baz değer istenirse 0'dan küçüğe de ayarlanabilir, bunun çok kullanım yeri olduğunu düşünmüyorum ancak teorik olarak imkan bulunmaktadır.
Boyut/Uzunluk/Eleman Sayısı ve Üst Değer(Son eleman indexi)
VBA:Dizi boyutu, dizi tanımlanırken parantez içinde verilen değer+1'dir,
yani parantez içine yazılan değer boyut değil son indextir ve
son index Ubound(dizi) ile boyut ise
Ubound(dizi)+1 fonksiyonu ile elde edilir.
Dolu eleman sayısı ise loop'a sokularak bulunur.
VB.Net:Dizi boyutu, dizi tanımlanırken parantez içinde verilen değer+1'dir,
yani parantez içine yazılan değer boyut değil son indextir
ve son index GetUpperBound
ile boyut ise Length özelliği veya
GetLength(d) metodu ile elde edilir.
GetLength ile belirli bir boyuttaki elemans sayısı alınırken Length ile tüm
boyutlardaki eleman toplamı gelir. Dolu eleman sayısı ise loop'a sokularak
bulunur.
Dizilerin bir boyutu olması gerektiğini biliyoruz, ancak VBA ve VB.Net'te ilk tanımlarken boyut vermek zorunda değiliz, boyutsuz tanımlayıp, daha sonra ReDim ifadesi ile de boyut verebiliriz.
Aşağıdaki konu başlığında bunun detaylarını görebilirsiniz.
VBA/VB.Net(List(sadece VB.Net)/Collection/Dictionary):Dizimsi yapıların baştan belirlenmiş bir boyutu yoktur, belli bir andaki boyutu Count property'si ile bulunur. Boyutsuz tanımlandıkları için dolu eleman sayısı diye bir kavram yoktur. Son eleman indexi, Count-1 şeklinde bulunur.
C#:C#'ta dizi boyutu parantez içindeki rakamdır, dolayısıyla
son index numarası da bundan 1 eksik olan rakamdır. Kullanılan özellik ve
metodlar VB.Net ile aynıdır.
C#(List/Dictionary/Collection):VB.Net'teki gibi C#'ta da dizimsi elemanların eleman sayısı Count propertysi ile tespit edilir.
Javascript(Array):Boyut length ile alınır.
Initialization(Diziye ilk değer atama)
The default values of numeric array elements are set to zero, and reference elements are set to null.
VBA:VB'de dizi tanımlaması aşağıdaki şekillerde yapılabilir
Dim dizi1() as String 'eleman sayısı sonraya bırakılabilir. VBA'da veritipi belirtilmezse Variant olur, VB.Nette veritipi belirtilmelidir
Dim dizi2(5) as String 'son indexi 5 olan 6 elemanlı dizi
Dim dizi3(1 to 5) as String 'son indexi 5 olan 5 elemanlı dizi
Dim dizi4 = Array("Elma","Armut","Karpuz") 'Elemanlar baştan belirtilerek. Veri tipi belritilemdiği için Varianttır.
VB.Net:VB.Net'te de VBA ile aynı ifadeler geçerli iken ayrıca aşağıdaki gibi de initialization yapılabilir.
Dim nums() As Integer = {1, 2, 3}
C#:Dizi üyeleri, eğer deklarasyon anında belirtilmedilerse default değerleri atanır. Ayrıca boyut veya elemanlardan biri mutlaka belirtilmelidir
Aşağıda, MSDN sitesinden alınan örnek başlatım şekilleri bulunuyor.
// Tek boyutlu nümerik diziler
int[] n0 = new int[4];//sadece boyut belirtilip, değer olarak default değerler atanır, bu örnekte 0 atanır. gerektiğinde bunların dğeerleri program akışı içinde atanır
int[] n1 = new int[4] {2, 4, 6, 8};//boyut ve elemanlar birlikte belirtilebilir
int[] n2 = new int[] {2, 4, 6, 8};//sadece elemanlar new ifadesi ile belirtilebilir
int[] n3 = new[] {2,4,6,8}//Sistem kendisi anlar ne tipte olduğunu
int[] n4 = {2, 4, 6, 8};//sadece elemanlar new ifadesi olmadan belirtilebilir
// Tek boyultu string diziler
string[] s0 = new string[3];//defualt değer olarak null atanır, çünkü string bir referans tiptir
string[] s1 = new string[3] {"John", "Paul", "Mary"};
string[] s2 = new string[] {"John", "Paul", "Mary"};
string[] s3 = new[] {"John", "Paul", "Mary"};
string[] s4 = {"John", "Paul", "Mary"};
//boş ve null diziler
int[] bosArray = new int[0]; // Boş dizi
int[] nullArray; // Tüm dizilerin default değeri Null'dır, çünkü diziler referans tipli nesnelerdir. İçeriği belirtilmediği için bu dizinin de şuanki değeri null'dır.
//int[] nullArray; ifadesinin default değerinin null olması ile, int[] dizi=new int[4]; ifadesinin elemanları int olup elemanlar belirtilemdiği için bunları default değeri 0dır. yani ilkinde dizniin kendisi default değernine, ikncisinde ise elemanlar default değerlerine atanır.
Bunlardan ilk 4ü aynı zamanda var ifadesi ile de yapılabilrdi, çünkü eşitliğin sağındaki bilgi diziyi başlatmak için yeterlidir, ancak 5. satır mutlaka belirtildiği gibi yazılmalıdır. Ör:
var s1 = new string[3] {"John", "Paul", "Mary"};
Javascript:Initialization kavramı yoktur. Var ifadesi ile
diziyi yaratmak yeterlidir. Ayrıca javascript elemanları objedir, bu nedenle
belirli bir veritipi belirtilmez, yani aynı dizi içinde hem string hem nümerik
elemanlar bulunabilir.
var cars = ["Saab", "Volvo", "BMW"];
var cars = new Array("Saab", "Volvo", "BMW"); //ancak bunun kullanılması önerilmiyor, bi üstteki hem verimlilik açısından hemn okunurluk açısından daha iyidir
Veri ekleme
VBA:Normal dizilerde eleman ekleme, ilgili indeksteki
elemana değer atama şeklinde gerçekleşir. Dizinin sonuna eleman ekleme, veya
iki eleman arsına eleman yerleştirme diye birşey yoktur. Collectionlarda,
listenin sonuna Add metodu ile ekleme yapılır. Dictionary'lerde de gerek Add
metodu ile veya dizilerdeki gibi doğruda atama yöntemiyle eleman
eklenebilir. Ne Colletionda ne Dictionary'de araya eleman ekleme diye birşey
bulunmamaktadır.
VB.Net ve C#:VBA için söylenenler geçerli olup dizimsi
yapıların her biri için farklı bir eleman eklem yöntemi vardır. Mesela List
için Add, Queue için Enqueue, Stack için Push gibi.
Javascript:Push metodu ile yeni eleman eklenebileceği gibi index numarası
verilerek de ilgili indexe eleman eklenebilir.
fruits.push("Lemon");
fruits[fruits.length] = "Lemon"; //bir üstteki ile aynı sonucu döndürür