C# operator precedence ve değerlendirme sırası açıklandı
C#'ın bir ifadeyi gerçekte nasıl okuduğunu adım adım anlatan bir yazı: precedence ve associativity gruplamayı belirlerken operand değerlendirmesi soldan sağa ilerliyor. Metot çağrıları, çıkarma, null coalescing zincirleri ve short-circuit örnekleriyle hangi kuralın nerede devreye girdiği ve sezginin nerede yanıldığı gösteriliyor.
Kilit noktalar
- Precedence ifadenin nasıl gruplandığını belirler; metot çağrılarını yeniden sıralamaz, çünkü operandlar soldan sağa değerlendirilir.
- Associativity yalnızca aynı precedence seviyesi içinde devreye girer: çıkarma sola, assignment, null coalescing ve conditional operator sağa ilişkilidir.
- Sağa ilişkili `??` zinciri bile en soldaki operandı önce değerlendirir ve null olmayan değer bulununca sonrakileri atlar.
- Parantezler yapıyı düzeltir, çalışma sırasını değil; görünür bir sıra gerekiyorsa ifadeyi ayrı statement'lara bölün.
- `&&` operatörü `||` operatöründen daha sıkı bağlanır; hangi dalın kısa devre yapacağını düşünmeden önce gruplama netleşmelidir.
- Erken bir operandda oluşan exception sonrakilerin değerlendirilmesini durdurur; async çağrıların başlatılma sırası tamamlanma sırası hakkında bilgi vermez.
C# dilinde operator precedence ve operand değerlendirme sırası birbirinden ayrı iki kuraldır; ikisini karıştırmak yanlış açıklamalara yol açar. Nick Cosentino, .NET 10 / C# 14 temelinde farkı ele alıyor: gruplama dilbilgisi tarafından belirlenir, operand ifadeleri ise yine soldan sağa değerlendirilir. Bu yüzden bir ifadenin solundaki metot çağrısı, sağındaki daha yüksek öncelikli çarpımdan önce çalışır; çarpım yalnızca daha sıkı gruplanır.
Yazı, associativity ile çalışma sırasını da ayırıyor. Çıkarma sola, null coalescing sağa ilişkilidir; buna rağmen `??` zinciri en soldaki operandı önce test eder ve değer bulunduğunda geri kalanı çağırmaz; C# 14'ün null-conditional assignment davranışı da aynı koşullu mantığa dayanır. `&&` ve `||` kısa devre davranışı, aritmetik ile karşılaştırmayı karıştıran ifadeler ve yan etkili operandlar da aynı çerçevede işleniyor; önerilen inceleme yöntemi en içteki alt ifadeden başlayıp yalnızca yorumların farklı sonuç verdiği örnekleri kanıt olarak kullanmak.
Gerçek dünyada kullanımı
- Null coalescing zincirinin sağdan sola çalıştığı sanılan bir pull request'i incelerken gerçek değerlendirme sırasını doğrulamak.
- `&&` ve `||` karışımı içeren yetkilendirme koşulunu, gruplama yazılı iş kuralıyla aynı olacak şekilde sadeleştirmek.
- Soldaki metot çağrısının sağdaki yüksek öncelikli işlemden önce çalıştığını gösteren log sırasını debug etmek.
- Property getter ve assignment içeren yoğun bir ifadenin refactor sırasında ayrı statement'lara bölünmesi gerekip gerekmediğine karar vermek.
Neden önemli
İki kuralı karıştırmak kodun gerçekte ne çalıştırdığına dair yanlış varsayımlar üretir; atlanan validasyonlar, istenmeyen yan etkiler ve anlaşılması zor bug'lar tam olarak buradan çıkar.