Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tip
Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın.
Başka bir dilden mi geliyorsunuz? C# dilindeki ifadeler Java, C++ ve JavaScript'te olduğu kadar çalışır. Dikkate değer bir fark şudur: += gibi bileşik atama işleçleri ile ++ artım işleci C#’ta birer ifadedir, bu nedenle daha büyük ifadelerin içinde yer alabilirler.
Bir ifade, derleyicinin bir değer üretmek için değerlendirdiği bir kod parçasıdır — bir sayı, bir dize, bir referans veya bir bool. Örneğin, 3 + 4 * 2, 11 tamsayısına değerlendirilen bir ifadedir ve total > 10, false veya true olarak değerlendirilen bir ifadedir.
En basit ifadeler sabit değerlerdir (örneğin 42 veya "hello") ve değişken adlarıdır (örneğin total). Daha basit ifadeleri işleçlerle birleştirerek daha karmaşık ifadeler oluşturursunuz.
İfadeler ve deyimler
İfade bir değer üretir.
Deyimi, programın yürüttüğü eksiksiz bir yönergedir. Birçok deyim ifadeler içerir. Örneğin, int total = 3 + 4 * 2; değişken bildirim deyimidir. Derleyici, öğesini üreten 11başlatıcı ifadesini 3 + 4 * 2değerlendirir ve bu değeri yeni değişkenine totalatar.
Bir ifadeyi bir söz öbeği, C# deyimini ise tam bir cümle gibi düşünebilirsiniz. Bu çalışma tanımları, C# hakkında daha fazla bilgi edindikçe karşılaşabileceğiniz resmi terminolojiyi ve açıklamaları anlamanıza yardımcı olur, ancak sıradan kodlama nadiren ayrımı bilinçli olarak hatırlamanızı gerektirir.
İfadeleri birleştirme
İfadeler birleştirilebilir.
3 + 4 * 2düşünün. Bu tek ifade aslında iki küçük ifade içerir: çarpma ifadesi4 * 2 ve ekleme ifadesi3 + <result>. İfadeler birleştirildiğinde, C# önce hangisinin değerlendirileceğine karar vermek için bir kurala ihtiyaç duyar. Bu kural işleç önceliğidir.
Öncelik hiyerarşisinin tamamını ezberlemeniz gerekmez. Sonraki bölüm, temel gruplamaları özetler ve emin olmadığınızda parantezler işlem sırasını açıkça belirtmenizi sağlar.
İşleç önceliği
İşleç önceliği , birleştirilmiş ifadenin alt ifadelere nasıl gruplandırıldığını belirler. Bu kavram matematik sınıfından işlem sırası kurallarına benzer. Daha yüksek önceliğe sahip bir işleç, işlenenlerine daha güçlü bağlanır. İfade, bu işlenenler birlikte parantez içinde olacak şekilde yapılandırılmıştır.
3 + 4 * 2 içinde, *, +'den daha yüksek önceliğe sahiptir; bu nedenle ifade, (3 + 4) * 2 olarak değil, 3 + (4 * 2) olarak gruplanır.
C# burada özetlenen dörtten daha fazla öncelik grubuna sahiptir. Bu ek gruplar, toplamadan önce çarpma gibi tanıdık kuralları zorunlu kılar ve tüm işleç kümesini kapsar. Aşağıdaki gruplar günlük kodda en sık karşılaştığınız şeyleri kapsar:
-
Birincil, birli ve aralık — bunlar üç ayrı öncelik grubu olup bunların tümü aritmetikten daha sıkı bağlanır. Bu özet, bunları tek bir adımda birleştirir çünkü pratikte hepsi aritmetikten önce uygulanır.
-
Birincil işleçler —üye erişimi (
x.y), yöntem çağrıları (f()), dizin oluşturma (a[i]) ve null koşullu erişim (?.,?[]) — en sıkı şekilde bağlanır. -
Birli işleçler tek bir işlenen üzerinde çalışır: olumsuzlama (
-x), mantıksal DEĞİl (!flag), ön ek artışı (++i) ve sonek artışı (i++). -
range işleci (
..),array[1..4]gibi dilim ifadeleri için dizin aralıkları oluşturur.
-
Birincil işleçler —üye erişimi (
-
Aritmetik —
*,/ve%,+ve-'den daha sıkı bağlanır. Çarpma ve bölme, toplama ve çıkarmadan önce gerçekleşir. -
Karşılaştırma —
<,>,<=, ,>=,==,!=, bağlama işlemi aritmetikten daha az sıkıdır, dolayısıyla aritmetik karşılaştırmadan önce tamamlar. -
Mantıksal —
&&ve||, yaygın işleçler arasında en gevşek bağlanır; bu nedenle karşılaştırmalar mantıksal birleştirmeden önce değerlendirilir.
Bu öncelik, ifadenin score + bonus > threshold && attempts < maxAttempts tam olarak okuduğunuz gibi değerlendirildiği anlamına gelir: score ile bonus öğelerini toplayın, toplamı threshold ile karşılaştırın, attempts öğesini maxAttempts ile karşılaştırın, ardından iki bool sonucunu && ile birleştirin. Her gruplamanın açık olmasını sağlamak için ayraç eklemek aynı yapıyı gösterir: ((score + bonus) > threshold) && (attempts < maxAttempts).
Her işleci kapsayan tam öncelik hiyerarşisi için bkz. C# işleçleri ve ifadeleri.
Amacı netleştirmek için parantez kullanın
Parantezler önceliği geçersiz kılar ve amacınızı aynı anda belgeler. Yukarıdaki gruplarda sıralama belirgin değilse parantez ekleyin:
int score = 80;
int bonus = 15;
int threshold = 90;
bool eligible = true;
// Without parentheses: || binds less tightly than &&, so this reads as:
// eligible && (score + bonus > threshold) || bonus > 20
bool result1 = eligible && score + bonus > threshold || bonus > 20;
// With parentheses: forces the || to combine two complete conditions
bool result2 = (eligible && score + bonus > threshold) || bonus > 20;
Console.WriteLine(result1); // => True
Console.WriteLine(result2); // => True
// Parentheses can also change the result:
bool isAdmin = false;
bool isOwner = true;
// Without: && binds tighter, so: (isAdmin && isOwner) || true
bool access1 = isAdmin && isOwner || true;
// With: forces the || to run first
bool access2 = isAdmin && (isOwner || true);
Console.WriteLine(access1); // => True (false && true is false; false || true is true)
Console.WriteLine(access2); // => False (false && anything is false)
Son iki satır, parantezlerin yalnızca stili değil sonucu değiştirebileceğini gösterir.
&& ve || birlikte göründüğünde, önce hangi koşulun birleştirildiğini açıkça belirtmek için parantez ekleyin.
(isAdmin && isOwner) || isSuperUser’ı gören bir okuyucu niyeti hemen anlar.
İfadeler nasıl değerlendirilir?
C#’ın bileşik ifadeleri nasıl değerlendirdiğini anlamak, bir benzetmeyle daha kolaydır. Kalem ve kağıtla karmaşık bir matematik sorunu üzerinde çalışmayı düşünün: En içteki veya en yüksek öncelikli alt ifadeyi tanımlar, ara değerini hesaplar, sonucu yazar ve son yanıta ulaşana kadar sonraki alt ifadeyle tekrarlarsınız.
C#, iki kural tarafından yönlendirilen aynı işlemi izler:
Kural 1: İşlenenler soldan sağa doğru değerlendirilir. herhangi bir ikili ifade için, işleç uygulanmadan önce her iki işlenen de tam olarak değerlendirilmelidir. C# önce sol işleneni, ardından sağı değerlendirir ve ardından işlemi gerçekleştirir.
Kural 2: Bazı işleçler kısa devre yapar. Sonuç belirlenir belirlenmez belirli işleçler değerlendirmeyi durdurur ve kalan işlenenleri atlar:
-
&&(koşullu VE): sol taraffalseolur olmazfalsedeğerini döndürür. Sağ taraf hiçbir zaman değerlendirilmez. -
||(koşullu VEYA): sol taraftrueolur olmaztruedöndürür. Sağ taraf hiçbir zaman değerlendirilmez. -
?:(koşullu/üçüncül): Yalnızca koşulla eşleşen dalı değerlendirir; diğer dal hiçbir zaman değerlendirilmez. -
?.(null koşullu üye erişimi) ve?[](null koşullu öğe erişimi): sol tarafnullolduğunda, üye erişimini veya dizin erişimini atlayarak hemen durur venulldöndürür. -
??=(null birleştirme atama işleci): Sağ taraftaki değeri yalnızca sol tarafnullolduğunda atar.
Kağıt-kalem değerlendirmesi
ifadesini 3 + 6 / 2göz önünde bulundurun. Toplama okuma sıralamasında ilk görünse de, /, 6 / 2 öğesinden daha yüksek önceliğe sahiptir; bu nedenle önce değerlendirilen alt ifade + olur. Kağıt üzerinde yaptığınız gibi adım adım ilerleyin:
3 + 6 / 2
↓ (evaluate 6 / 2 → 3)
3 + 3
↓ (evaluate 3 + 3 → 6)
6
// 3 + 6 / 2
// Step 1: 6 / 2 has higher precedence → interim value 3
// Step 2: 3 + 3 → final result 6
int result = 3 + 6 / 2;
Console.WriteLine(result); // => 6
3 tarafından üretilen ara değer 6 / 2, + için sağ işlenen hâline gelir ve nihai sonuç 6 olur. Her alt ifade bir ara değer üretir; bu ara değerler, yalnızca bir değer kalana kadar sonraki alt ifadeyi besler.
Birleşme yönü bununla ilişkili bir kavramdır: İki işleç aynı önceliğe sahip olduğunda, hangisinin önce uygulanacağını birleşme yönü belirler. C# işleçlerinin çoğu sol ilişkilendiricidir, yani soldan sağa gruplandırılır. Yani a - b - c, (a - b) - c ile aynıdır, a - (b - c) ile değil.
Pratikte kısa devre değerlendirmesi
Kısa devre değerlendirmesi özellikle null denetimler için kullanışlıdır:
string? text = null;
// Safe: second condition runs only when text is not null
bool hasContent = text != null && text.Length > 0;
Console.WriteLine(hasContent); // => False (short-circuits after null check; no NullReferenceException)
text = "hello";
hasContent = text != null && text.Length > 0;
Console.WriteLine(hasContent); // => True
// || short-circuits on true: right side is never evaluated when left side is true
string word = "hello";
bool anyMatch = word.StartsWith("h") || word.StartsWith("x");
Console.WriteLine(anyMatch); // => True (right side never evaluated)
// ?. short-circuits on null: returns null without accessing .Length
string? maybeNull = null;
int? length = maybeNull?.Length; // length is null; no NullReferenceException
Console.WriteLine(length.HasValue); // => False
text != null && text.Length > 0 güvenlidir çünkü ikinci koşul yalnızca text olmadığında nullçalışır. Benzer şekilde, ?., bir if referansıyla karşılaştığında değerlendirmeyi durdurur; bu da açık bir NullReferenceException denetimi olmadan bir null oluşmasını önler.
Null güvenli işleçlere daha geniş bir bakış için bkz. C# null işleçleri.
Ayrıca bakınız
- C# işleçleri ve ifadeleri (dil başvurusu) — tam öncelik tablosu ve her işleç
- Aritmetik, karşılaştırma, mantıksal ve atama işleçleri — derinlemesine günlük işleçler
-
Eşitlik karşılaştırmaları — ,
!=veEqualsçalışma şekli== -
C# null işleçleri —
?.,??ve??= - Boole mantıksal işleçleri