Hata ayıklama yöntemlerinde koşullu dize değerlendirmesi
İlişkilendirilmiş dizelerin onay iletileri olarak kullanılması yaygındır, örneğin:
Debug.Assert(result != x, $"Unexpected result {result}");
Ancak, önceki sürümlerde bu durum, koşul olsa bile her çağrıda biçimlendirme sonucu da dahil olmak üzere ileti için bir dize oluşturulmasına neden olur true
. Ve onaylar için tipik kullanım, her zaman doğru olması gereken bir koşul hakkında olmalarıdır.
C# 10, dizelere ek olarak özel "işleyicileri" hedefleme özelliği de dahil olmak üzere daha iyi dize ilişkilendirme desteği ekler. .NET 6'da sınıfıDebug, yalnızca ileti gerekliyse, ilişkilendirilmiş dize biçimlendirme öğelerini koşullu olarak değerlendirmek için bu işlevi kullanan yeni , WriteIfWriteLineIf aşırı yüklemelerine Assertsahiptir. C# derleyicisi bu yeni aşırı yüklemeleri tercih edecektir. Biçimlendirme öğeleri sessize alınıyorsa ve onay tetiklenmese bile program bu mutasyonların görünür olmasına güveniyorsa, davranışta bir fark gözlemleyebilirsiniz.
Önceki davranış
Aşağıdaki kodda r.ToString()
her zaman çağrılır.
Debug.Assert(true, $"{r.ToString()}");
Yeni davranış
Aşağıdaki kodda hiçbir r.ToString()
zaman çağrılmayacak, çünkü ileti yalnızca koşul olduğunda false
gereklidir.
Debug.Assert(true, $"{r.ToString()}");
Sürüm kullanıma sunulmuştur
6.0 RC 1
Hataya neden olan değişikliğin türü
Bu değişiklik kaynak uyumluluğunu etkileyebilir.
Değişiklik nedeni
Bu değişiklik performansı geliştirmek için kullanıma sunulmuştur.
Önerilen eylem
Yöntemlerle Debug kullanılan ilişkilendirilmiş dizeler paylaşılan durumu kapatmamalıdır. (Bu yöntemler de derleme sabiti DEBUG
üzerinde koşullu.) Herhangi bir nedenle, eski davranışı korumak kritikse, ilişkilendirme dizesinden önce bir (string)
atama ekleyin. Bu atama, derleyiciyi mevcut aşırı yüklemeye bağlamaya zorlar ve dizenin her zaman gerçekleştirilmesini sağlar.
Etkilenen API’ler
- System.Diagnostics.Debug.Assert(Boolean, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String, Object[])
- System.Diagnostics.Debug.WriteIf(Boolean, String)
- System.Diagnostics.Debug.WriteIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteIf(Boolean, Object, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, Object, String)