Değişkenler (Variables)

İşte bir değişken oluşturmanın ve başlatmanın bir örneği:

var isim = 'Bayram';

Değişkenler referansları depolar. isim adlı değişken, "Bayram" değerine sahip bir String nesnesine bir referans içerir.

İsim değişkeninin türü String olarak çıkarılabilir, ancak türü belirterek bunu değiştirebilirsiniz. Eğer bir nesne tek bir türle sınırlı değilse, Object türünü belirtin (veya gerekiyorsa dynamic).

Object isim = 'Bayram';

Başka bir seçenek de türü açıkça belirtmektir:

String isim = 'Bayram';

Null Güvenliği

Dart dilinde sağlam null güvenliği uygulanır.

Null güvenliği, null olarak ayarlanmış değişkenlere istenmeyen erişimden kaynaklanan hataları önler. Bu hata, null dereference hatası olarak adlandırılır. Null dereference hatası, bir ifadeyi null'a değerlendiren bir özelliğe veya bir yöntemi çağırdığınızda ortaya çıkar. Bu kurala bir istisna, null'un desteklediği bir özellik veya yöntem olduğunda söz konusu olabilir, örneğin toString() veya hashCode. Null güvenliği, Dart derleyicisinin bu potansiyel hataları derleme zamanında tespit etmesini sağlar.

Örneğin, bir int değişkeni inin mutlak değerini bulmak istediğinizi varsayalım. Eğer i null ise, i.abs() çağrısı bir null dereference hatasına neden olur. Diğer dillerde bu denemek runtime hatasına yol açabilir, ancak Dart derleyicisi bu eylemleri yasaklar. Bu nedenle, Dart uygulamaları runtime hatalara neden olamaz.

  • Bir değişken, parametre veya başka bir ilgili bileşen için bir tür belirttiğinizde, türün null'a izin verip vermediğini kontrol edebilirsiniz. Null kullanılabilirliği etkinleştirmek için tür bildiriminin sonuna bir ? eklersiniz.

String? isim  // Null olabilir tür. Null veya string olabilir.
String isim   // Null olamaz tür. Null olamaz ancak string olabilir.
  • Değişkenleri kullanmadan önce başlatmalısınız. Null olabilen değişkenler varsayılan olarak null ile başlatıldığından, bunlar varsayılan olarak başlatılır. Dart, başlatılmamış bir değişkeni gözlemlemenize izin vermez. Bu, alıcı türü null olabilir, ancak null kullanılan yöntemi veya özelliği desteklemez şeklinde hatalı bir erişimi önler.

  • Null olabilen bir türdeki bir ifadenin özelliklerine veya yöntemlerine erişemezsiniz. Null desteklediği bir özellik veya yöntem olduğunda aynı istisna geçerli olur, örneğin hashCode veya toString().

Sağlam null güvenliği, potansiyel runtime hatalarını düzenleme zamanı analiz hatalarına dönüştürür. Null güvenliği, bir değişkenin;

  • Başlangıçta null olmayan bir değerle başlatılmadığında,

ya da

  • Null bir değer atandığında,

bu durumları kontrol eder ve bu hataları uygulamanızı dağıtmadan önce düzeltmenize olanak tanır.

Varsayılan Değer

Başlatılmamış null olabilen türdeki değişkenlerin başlangıç değeri null'dir. Hatta sayılar gibi türlerin de başlangıçta null olmasının nedeni, Dart'ın her şeyin nesne olduğu bir dil olmasıdır.

int? satirSayisi;
assert(satirSayisi == null);

Not

Üretim kodu assert() çağrısını görmezden gelir. Bununla birlikte, geliştirme sırasında assert(şart) şartı yanlışsa bir istisna fırlatır. Ayrıntılar için Assert bölümüne bakın.

Null güvenliği ile, null olmayan değişkenlerin değerlerini kullanmadan önce başlatmalısınız:

int satirSayisi = 0;

Bir yerel değişkenin tanımlandığı yerde başlatılmasına gerek yoktur, ancak kullanılmadan önce bir değer atanmalıdır. Örneğin, aşağıdaki kod geçerlidir çünkü Dart, satirSayisi'nı print() fonksiyonuna geçirildiği noktada satirSayisi'nın null olmadığını algılayabilir:

int satirSayisi;

if (satirlariSayalim) {
  satirSayisi = satirSay();
} else {
  satirSayisi = 0;
}

print(satirSayisi);

Late Değişkenler

Late değişken belirleyici (modifier), iki kullanım durumuna sahiptir:

Değişkenin bildiriminden sonra başlatılan bir boş olmayan değişkeni belirtme.

Bir değişkeni tembellikle başlatma.

Eğer bir değişkenin kullanılmadan önce ayarlandığından eminseniz, ancak Dart bu konuda anlaşmazlık yaşıyorsa, değişkeni late olarak işaretleyerek hatayı düzeltebilirsiniz:

Genellikle Dart'ın kontrol akış analizi, bir boş olmayan değişkenin kullanılmadan önce bir boş olmayan bir değere ayarlandığını algılayabilir, ancak bazen analiz başarısız olur. İki yaygın durum, üst düzey değişkenler ve örnek değişkenlerdir: Dart genellikle bunların ayarlanıp ayarlanmadığını belirleyemez, bu yüzden denemez.

late String aciklama;

void main() {
  aciklama = 'Dart diline hoş geldiniz!';
  print(aciklama);
}

Not

late değişkeni başlatmayı unutursanız, değişken kullanıldığında çalışma zamanında bir hata oluşur.

Bir değişkeni late olarak işaretlediğinizde, ancak değişken kullanıldığında ilk kez başlatılır. Bu tembel başlatma, birkaç durumda kullanışlıdır:

  1. Değişken muhtemelen gerekli değildir.

  2. Bir örnek değişkenini başlatıyorsanız ve başlatıcı bu değişkene erişime ihtiyaç duyuyorsa.

Aşağıdaki örnekte, sıcaklık değişkeni hiç kullanılmazsa, zahmetli termometreGetir() fonksiyonu hiç çağrılmaz:

// Bu, programın termometreGetir()'ı çağırışıdır.
late String sicaklik = termometreGetir(); // Tembel başlatma.

Final ve Const

Eğer bir değişkeni asla değiştirmeyi düşünmüyorsanız, var yerine final veya const kullanın. Bir final değişkeni yalnızca bir kez ayarlanabilir; bir const değişkeni derleme zamanında sabittir. (Const değişkenler örtük olarak finaldir.)

Not

Örnek değişkenleri final olabilir, ancak const olamaz.

İşte final bir değişken oluşturma ve ayarlama örneği:

final isim = 'Bayram'; // Tür belirtimi olmadan
final String takmaAd = 'Bayramlcm';

Bir final değişkeninin değerini değiştiremezsiniz:

isim = 'Emirhan'; // Hata: bir final değişkeni yalnızca bir kez ayarlanabilir.

Sabit bir değere sahip olmasını istediğiniz değişkenler için const kullanın. Eğer const değişkeni sınıf düzeyinde kullanıyorsanız, onu static const olarak işaretleyin. Değişkeni bildiğiniz yerde, değeri bir derleme zamanı sabiti olarak ayarlayın; bu bir sayı veya string literali, bir const değişkeni veya sabit sayılar üzerinde yapılan bir aritmetik işlemin sonucu olabilir:

const bar = 1000000; // Basınç birimi (dyne/cm2)
const double atmosfer = 1.01325 * bar; // Standart atmosfer

Const anahtar kelimesi sadece sabit değişkenlerin deklarasyonu için değil, aynı zamanda sabit değerler oluşturmak ve sabit değerler yaratan yapıcıları deklare etmek için de kullanılabilir. Herhangi bir değişken, bir sabit değere sahip olabilir.

var foo = const [];
final bar = const [];
const baz = []; // `const []` ile eşdeğer

Const deklarasyonunun başlatma ifadesinden const'ı atlayabilirsiniz, örneğin baz'da olduğu gibi. Detaylar için, Const'ı gereksiz yere kullanma başlığına bakın.

Bir non-final (final olmayan), non-const (const olmayan) değişkenin değerini değiştirebilirsiniz, hatta başlangıçta const bir değeri olduğu halde:

foo = [1, 2, 3]; // Başlangıçta const []

Ancak, const bir değişkenin değerini değiştiremezsiniz:

baz = [42]; // Hata: Sabit değişkenlere değer atılamaz.

Tip kontrol ve dönüşümleri (is ve as), koleksiyon if, ve yayılma operatörleri (... ve ...?) kullanarak tür kontrolü yapan ve dönüşüm yapan sabitler tanımlayabilirsiniz:

const Object i = 3; // i, int değeri olan bir const Object'tir...
const list = [i as int]; // Bir tip dönüşümü kullanın.
const map = {if (i is int) i: 'int'}; // is ve koleksiyon if kullanın.
const set = {if (list is List<int>) ...list}; // ...ve yayılma operatörünü kullanın.

Not

Bir final nesnesi değiştirilemez, ancak alanları değiştirilebilir. Buna karşılık, bir const nesnesi ve alanları değiştirilemez: bunlar değişmezdir.

Daha fazla bilgi için, Const, Final, List, Maps ve Class (Sınıflar) başlıklarını ziyaret edin.

Last updated